c# - 将 XML 发送到 sp 以进行插入

标签 c# sql-server xml stored-procedures

我有一个 myClass 的集合。我想使用 XML 将它发送到 sp。我不知道如何将集合转换为 xml。 将集合转换为xml后,我想将其发送到存储过程进行批量插入

请帮忙

最佳答案

您可以使用 XmlSerializer 将类序列化为 XML,然后将该 XML 值传递到存储过程,然后在存储过程中循环访问节点。除了 XML 之外,传递多行数据的另一种选择是使用 Table-Valued Parameters。 .

XML 方法看起来像这样:

MyClass myClass = new MyClass();

XmlSerializer serializer = new XmlSerializer(typeof(MyClass));

XmlWriterSettings settings = new XmlWriterSettings()
{
    Encoding = new UnicodeEncoding(false, false)
};

StringBuilder xml = new StringBuilder();

using (XmlWriter xw = XmlWriter.Create(xml, settings))
{
    serializer.Serialize(xw, myClass);
}

...

SqlCommand cmd = new SqlCommand()
{
    CommandText = "InsertMyClass",
    CommandType = CommandType.StoredProcedure
};

SqlParameter sqlParam = new SqlParameter()
{
    ParameterName = "@x",
    SqlDbType = SqlDbType.Xml,
    Value = xml.ToString()
};

cmd.Parameters.Add(sqlParam);

int count = cmd.ExecuteNonQuery();

为了举例,假设您的 XML 如下所示:

<MyClass>
  <Item>
    <ID>1</ID>
    <Property1>prop 1</Property1>
    <Property2>prop 2</Property2>
  </Item>
</MyClass>

然后存储过程可以进行插入:

CREATE PROCEDURE InsertMyClass
( 
    @x XML 
) 
AS
BEGIN

  INSERT INTO table (ID, Prop1, Prop2)
  SELECT 
      CAST(CAST(r.i.query('./ID/text()') AS VARCHAR(20)) AS INT) ,
      CAST(r.i.query('./Property1/text()') AS VARCHAR(20)),
      CAST(r.i.query('./Property2/text()') AS VARCHAR(20))
  FROM   
      @x.nodes('/MyClass/Item') R(i)

END

关于c# - 将 XML 发送到 sp 以进行插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4654226/

相关文章:

c# - 使用运行时类型调用通用方法并强制转换返回对象

c# - 如何阻止 BackgroundWorker 排队?

android - LinearLayout 会干扰其他对象吗?

Android XML 可绘制透明渐变

c# - 使用根中的数字对象反序列化 JSON

c# - 为什么结构内部的匿名方法不能访问 'this' 的实例成员

sql-server - 字符串结尾的通配符匹配索引

java - 是否有在 JSP 上显示数据库更改的最佳实践

php - 如何在 php/adodb 中读取大于 255 个字符的字符串?

java - XML 解析在 SAX 解析器内部如何工作?