.NET:如何将 XML 文档插入 SQL Server

2023-11-22

我想将任意 XML 插入 SQL Server。 XML 包含在XmlDocument object.

我想要插入的列是nvarchar, ntext, or xml列(如果它让您的生活更轻松,那么您可以选择它的类型。实际上,这是一个xml柱子。)

原型

void SaveXmlToDatabase(DbConnection connection,
      XmlDocument xmlToSave,
      String tableName, String columnName);
{

}

我问的原因是因为我正在尝试找到正确的方法来转动XmlDocument数据库可以接受的内容 - 确保保持编码正确:

  • 我必须确保插入期间使用的编码与数据库采用的编码相匹配
  • 我必须同步<?xml version="1.0" encoding="windows-1252"?> element

I know ntext, nvarchar, or xml存储为UTF-16SQL Server 内部。所以我必须确保将数据作为 UTF-16 提供给 SQL Server。这对于String.NET 中的 s,因为它们are统一码 UTF-16。

第二个问题是同步编码属性,这是一个更难解决的问题。我必须弄清楚如何通过XmlDocument object:

<?xml version="1.0" encoding="windows-1252"?>   (or whatever the encoding may be)

并调整为UTF-16

<?xml version="1.0" encoding="UTF-16"?>

我天真的尝试(失败了)

忽略 XML 声明中的编码,只考虑如何将任何内容保存到 SQL Server 中:

void SaveXmlToDatabase(DbConnection connection,
      XmlDocument xmlToSave,
      String tableName, String columnName);
{
   String sql = "INSERT INTO "+tableName+" ("+columnName+") 
          VALUES ('"+xmlToSave.ToString()+"')";

   using (DbCommand command = connection.CreateCommand())
   {
      command.CommandText = sql;

      DbTransaction trans = connection.BeginTransaction();
      try
      {
         command.ExecuteNonQuery();
         trans.Commit();
      }
      catch (Exception)
      {
         trans.Rollback();
         throw;
      }
   }
}

这会失败,因为sql我尝试运行的是:

INSERT INTO LiveData (RawXML) 
VALUES ('System.Xml.XmlDocument')

这是因为XmlDocument.ToString()返回“System.Xml.XmlDocument”。查看实现,可以看到它实际上正在调用:

this.GetType().ToString();

Aside:微软似乎竭尽全力阻止你 将 Xml 作为字符串获取 - 大概是因为它会导致错误 (但他们没有告诉我们有什么错误,为什么 它们是错误,或者right通向 转换一个XmlDocument变成一个String!)

See also

  • C#/SQL - 过程中的 SqlDbType.Xml 有什么问题?
  • 如何将 SqlXml 数据类型的 XmlDocument 转换为 XmlReader。

您必须使用 SqlParameter。 我建议这样做:

command.Parameters.Add(
   new SqlParameter("@xml", SqlDbType.Xml) 
       {Value = new SqlXml(new XmlTextReader(xmlToSave.InnerXml
                       , XmlNodeType.Document, null)) })

SQL 应该如下所示:

String sql = "INSERT INTO "+tableName+" ("+columnName+") VALUES (@xml)";

由于第一个子节点始终是 xml 节点,因此您可以使用以下语句替换编码。

xmlToSave.FirstChild.InnerText = "version=\"1.0\" encoding=\"UTF-16\"";

总而言之,它看起来像这样:

void SaveXmlToDatabase(DbConnection connection,
      XmlDocument xmlToSave,
      String tableName, String columnName);
{
   String sql = "INSERT INTO "+tableName+" ("+columnName+") VALUES (@xml)";

   using (DbCommand command = connection.CreateCommand())
   {
      xmlToSave.FirstChild.InnerText = "version=\"1.0\" encoding=\"UTF-16\"";             
      command.CommandText = sql;
      command.Parameters.Add(
        new SqlParameter("@xml", SqlDbType.Xml) 
           {Value = new SqlXml(new XmlTextReader(xmlToSave.InnerXml
                       , XmlNodeType.Document, null)) });


      DbTransaction trans = connection.BeginTransaction();
      try
      {
         command.ExecuteNonQuery();
         trans.Commit();
      }
      catch (Exception)
      {
         trans.Rollback();
         throw;
      }
   }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET:如何将 XML 文档插入 SQL Server 的相关文章

  • ElementTree findall() 返回空列表

    我正在尝试编写一个小脚本来与 last fm API 进行交互 我有一点工作经验ElementTree 但我之前使用它的方式似乎不起作用 它反而返回一个空列表 我删除了 API 密钥 因为我不知道它到底应该有多私密 并给出了我在其位置收到的
  • XML 文档可以同时遵循 DTD 和 XML 模式吗?

    XML 文档指定它遵循 DTD 是否合法 and一个架构 两者不会互相冲突吗 从技术上讲 我认为 DTD 无法识别引用架构的属性 名称空间声明和架构位置 会遇到问题 不过 我认为这取决于您如何验证 XML 以及如果指定了架构 您是否可以忽略
  • 从表变量中获取列的明确名称

    我可以这样声明一个表变量 DECLARE tv source TABLE c1 int providerName varchar 50 providerSMS varchar 50 如果我执行以下命令 我会看到类似于以下内容的表名称 468
  • 数据流任务的 Foreach 循环容器

    我想从 Oracle DB 导入近 1200 万条记录 但由于 SSIS 内存缓冲区问题 我需要每年迭代我的数据流任务 即 2005 年到 2012 年 7 次 我如何使用 foreach 我的 oracle 查询来获取每年的数据 Quer
  • 从 JDBC MSSQL 获取返回值

    我使用 Microsoft SQL Server JDBC Driver 2 0 通过 Java 连接到 SQL Server 2005 如何从存储过程中获取返回值 我正在做类似的事情 Connection connection dataS
  • End using 是否关闭打开的 SQL 连接

    如果我将 SQLConnection 包装在 using 中 我应该关闭它还是最终 using 处理它 using cn as new system data sqlclient sqlconnection cn open do a bun
  • Python - 将列表作为参数传递给 SQL,以及更多变量

    我试图在 python 3 6 中将未知数量的参数传递给 SQL Server 这是我使用 pypyodbc 的代码 cursor cnxn cursor theargs 1033286869 1053474957 1063654630 1
  • simplexml,返回具有相同标签的多个项目

    我将以下 XML 文件加载到 php simplexml 中
  • XSLT 1.0 对元素进行排序

    我有以下 XML 文档
  • 将多对多关系中的所有相关记录分组,SQL 图形连接组件

    希望我错过了一个简单的解决方案 我有两张桌子 其中包含一份公司列表 第二个包含出版商列表 两者之间的映射是多对多的 我想要做的是将表 A 中与表 B 中的发布商有任何关系的所有公司捆绑或分组 反之亦然 最终结果看起来像这样 GROUPID
  • 如何在 SQL Server 中引用触发器的“新”、“旧”行?

    所以我是 SQLite 的 SQL Server 新手 我习惯使用 New Old 关键字 我看到有些人使用insertedvalue 引用新创建的行 但这仅适用于插入而不适用于更新 我能得到类似的东西吗New我在这个查询中使用 creat
  • SQL Server 上的聚合(分组依据)如何工作?

    SQL Server如何实现group by子句 聚合 以执行计划作为灵感这个问题的 https stackoverflow com questions 1465827 select at onece query select p id D
  • 如何使 XMLUNIT 的 WithNodeFilter 动态 C#

    我正在开发一个比较 XML 文件的应用程序 用户可以输入他们想要在比较中排除的节点列表 为了进行比较 我正在使用XMLUNIT https www xmlunit org 我需要动态添加用户输入 下面的代码可以工作 但对于用户输入来说不是动
  • 从 MySql 迁移到 Sql Server 2008

    我有大约 200 GB 的 Mysql 转储文件 现在我需要迁移到 Sql server 2008 那么我应该遵循什么方法 我应该继续逐行 sql 语句还是有任何适合我的要求的 GUI 工具 微软 SQL Server 迁移 Assista
  • 为什么为 DATETIME 值定义加法运算符而不为 DATE 定义?

    我知道解决方法是使用DATEADD对于这两种数据类型 我想了解为什么语言设计者选择为一种数据类型而不是另一种数据类型定义此运算符 当您尝试直接在DATE DECLARE tomorrow DATE CONVERT DATE GETDATE
  • 派生列中的 SSIS 日期为 yyyy-mm-dd 格式

    我需要日期年 月 日ssis 派生列中的格式 我在用 DT DATE DT DBDATE GETDATE 其填充为2013 05 24 00 00 00 请建议 SSIS 派生列表达式变体 DT STR 4 1252 DATEPART yy
  • 如何使用vba解析XML

    我在 VBA 中工作 想要解析一个字符串 例如
  • SQL 缓存依赖关系的性能问题

    我正在开发一个项目 我们正在考虑将 SQLCacheDependency 与 SQL Server 2005 2008 一起使用 我们想知道这将如何影响系统的性能 所以我们想知道以下问题 SQLCacheDependency 对象 查询通知
  • 由于“获取连接”错误,SSIS 包失败

    SSIS 新手 我正在尝试运行包 但每次它返回 无法获取连接 ConnectionName 连接可能未正确配置 或者您可能没有此连接的正确权限 连接使用SQL login部署时我指定 依赖服务器存储进行加密 ServerStorage 登录
  • 从 WiX 引导 SQL Express?

    我正在开发一个 WPF 应用程序 并使用 WiX 作为安装程序 我想开始使用 SQL Express 2012 但希望首先解决安装程序问题 我正在寻找使用 WiX 检测 引导 安装 升级和卸载 SQL Express 2012 的完整示例

随机推荐

  • CallExpression 和 MemberExpression 之间的区别

    有什么不同 我看了ECMAScript规范 但不明白 真正的代码示例会有很大帮助 如果你能解释这里的每一行那就太好了 MemberExpression PrimaryExpression FunctionExpression MemberE
  • 检测有向图中循环的最佳算法[关闭]

    Closed 这个问题是基于意见的 目前不接受答案 是否有一种有效的算法来检测有向图中的循环 我有一个有向图 表示需要执行的作业的时间表 作业是节点 依赖项是边 我需要检测该图中导致循环依赖的循环错误情况 Tarjan 的强连通分量算法 h
  • Pandas Dataframe / Numpy 数组“轴”定义中的歧义

    我对 python 轴的定义方式以及它们是否引用 DataFrame 的行或列感到非常困惑 考虑下面的代码 gt gt gt df pd DataFrame 1 1 1 1 2 2 2 2 3 3 3 3 columns col1 col2
  • JavaScript 中的 Console.log 输出

    Why do console log 00 and console log 01 在浏览器控制台中打印 0 和 1 而不是 00 和 01 console log 00 prints 0 console log 01 prints 1 co
  • Flex-box:将最后一行与网格对齐

    我有一个简单的弹性盒布局 其中包含如下容器 grid display flex flex flow row wrap justify content space between 现在我希望最后一行中的项目与另一行对齐 justify con
  • 如何将相同类型的多个参数传递给 jQuery Get

    我正在尝试使用 jQuery get 从网站获取一些数据 我需要设置2个相同类型的参数 q Some Text q Some other text jQuery 似乎用第二个实例覆盖 q 的第一个实例 并且仅发送 1 有什么办法解决这个问题
  • 适用于 iOS 的 WebDav 客户端库 [已关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 是否有适用于 iOS 的 WebDav 客户端实现 看一下WTclient
  • 当只需要一个字节时,为什么 Rust 使用两个字节来表示这个枚举?

    它似乎足够聪明 只为 A 使用一个字节 但不够聪明 为 B 使用一个字节 即使只有 8 8 64 种可能性 有什么方法可以让 Rust 解决这个问题 还是我必须手动实现更紧凑的布局 游乐场链接 allow dead code enum A
  • Python 3:gzip.open() 和模式

    https docs python org 3 library gzip html 我正在考虑使用gzip open 我有点困惑mode争论 模式参数可以是 r rb a ab w wb x 中的任何一个 或 xb 表示二进制模式 或 rt
  • 检测 32 位或 64 位 Windows

    我想检测当前的Windows操作系统是32位还是64位 如何用C 实现呢 我不需要处理器类型 我想要操作系统的位类型 这是因为您可以在 64 位处理器上安装 32 位操作系统 要调用的函数是IsWow64Process or IsWow64
  • 无会话的 Passport js 身份验证

    我是expressjs和passportjs的初学者 我使用护照和 GoogleStrategy 通过谷歌进行身份验证 使用下面的代码我有req user id 123456 in 用户 你好路由处理程序 但我想得到一些类似的没有会话支持的
  • 如何使用 iCloud 访问 Xcode 项目

    我最近购买了一台 MacBook Pro 我将用它来开发 iPhone 应用程序 我希望能够在 Macbook 和 iMac 之间传输 Xcode 项目 就像使用 iCloud 传输 Word 文档一样 有没有一种安全的方法可以做到这一点
  • 递归关系[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 如何以最佳复杂度计算非常大的 n 例如 10 14 的 tribonacci 数 Tri
  • 帮助理解为什么我们的应用程序在Win7上弹出UAC对话框

    我们有一个 C 非托管应用程序 它似乎会导致 UAC 提示 似乎发生在Win7 而非 Vista 不幸的是 UAC dlg 是系统模式的 所以我无法附加调试器来检查代码所在的位置 并且在 msdev 下运行 我们使用的是 2008 以提升模
  • C中的任意长度字符串

    我需要对字符串进行一些操作 例如在某些位置添加字母 我不知道它的大小是多少 这取决于输入 如何定义字符串而不指定其大小 我希望它能够适应我放入其中的任何内容 为什么我不能只传递一个空的char 到一个方法 编译器不允许这样做 根据答案 我明
  • 如何避免Java编译中的“Method Too Large”错误?

    我有一个用 bigloo 方案功能语言编写的解析器 我需要将其编译成 java 类 整个解析器被编写为单个函数 不幸的是 这导致 JVM 编译器抛出 方法太大 警告 然后给出 localvar 中的远标签 错误 有什么可能的方法可以避免这个
  • 对于鼻子测试类使用 __init__(self) 而不是 setup(self) 有缺点吗?

    Running nosetests s for class TestTemp def init self print init self even 0 def setup self print setup self odd 1 def te
  • .NET 代码在正常进程退出时执行?

    In C有atexit函数 其中 atexit 函数注册给定的函数 以便在正常进程终止时通过 exit 3 或通过从程序的 main 返回来调用 Python 也有类似的功能 NET 是否提供了在正常进程终止时调用代码的方法 我知道有些事情
  • 如何在 swiftUI 中更改弹出窗口页面的大小和位置?

    我想设置Popover页面的位置和大小 我尝试了func popover的所有参数 我认为它可能与attachmentAnchor和arrowEdge有关 这是我的代码 import SwiftUI struct ContentView V
  • .NET:如何将 XML 文档插入 SQL Server

    我想将任意 XML 插入 SQL Server XML 包含在XmlDocument object 我想要插入的列是nvarchar ntext or xml列 如果它让您的生活更轻松 那么您可以选择它的类型 实际上 这是一个xml柱子 原