【发布时间】:2011-01-11 04:36:57
【问题描述】:
我有一个 myClass 的集合。我想使用 XML 将它发送到 sp。我不知道如何将集合转换为 xml。 将集合转换为 xml 后,我想将其发送到存储过程以进行批量插入
请帮忙
【问题讨论】:
-
您处理 XML 仅仅是因为您想通过调用一个存储过程来处理集合中的所有项目吗?
标签: c# sql-server xml stored-procedures
我有一个 myClass 的集合。我想使用 XML 将它发送到 sp。我不知道如何将集合转换为 xml。 将集合转换为 xml 后,我想将其发送到存储过程以进行批量插入
请帮忙
【问题讨论】:
标签: c# sql-server xml stored-procedures
您可以使用 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
【讨论】:
您可以使用XmlSerializer 将类序列化为 xml。您可以通过使用属性在一定程度上控制序列化模式 - 有关详细信息,请参阅 MSDN 链接。
在 Sql Server 端,您可以使用 OPENXML 将 xml 文档转换为可用于插入表中的行集。有关 OpenXml 的信息,请参阅 this (2000 version) 和 this (2008 version) - 这两个链接都包含可以帮助您入门的示例。
最后,Bulk Insert from XML data 是可能的,但这通常会从文件中插入数据,我怀疑它是否适合您的场景。
【讨论】: