Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将XML发送到sp以进行插入_C#_Sql Server_Xml_Stored Procedures - Fatal编程技术网

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

C# 将XML发送到sp以进行插入,c#,sql-server,xml,stored-procedures,C#,Sql Server,Xml,Stored Procedures,我有一个我的班级的集合。我想使用XML将其发送到sp。我不知道如何将集合转换为xml。 将集合转换为xml后,我希望将其发送到存储过程以进行大容量插入 请提供帮助您可以使用从序列化类到xml。您可以通过使用属性在某种程度上控制序列化模式-有关更多信息,请参阅MSDN链接 在Sql Server端,可以使用OPENXML将xml文档转换为行集,以便插入到表中。有关OpenXml的信息,请参阅和-这两个链接都包含应该让您开始学习的示例 最后,这是可能的,但通常会从文件中插入数据,我怀疑它是否适合您的

我有一个我的班级的集合。我想使用XML将其发送到sp。我不知道如何将集合转换为xml。 将集合转换为xml后,我希望将其发送到存储过程以进行大容量插入

请提供帮助

您可以使用从序列化类到xml。您可以通过使用属性在某种程度上控制序列化模式-有关更多信息,请参阅MSDN链接

在Sql Server端,可以使用OPENXML将xml文档转换为行集,以便插入到表中。有关OpenXml的信息,请参阅和-这两个链接都包含应该让您开始学习的示例

最后,这是可能的,但通常会从文件中插入数据,我怀疑它是否适合您的场景。

您可以使用从序列化类到xml。您可以通过使用属性在某种程度上控制序列化模式-有关更多信息,请参阅MSDN链接

在Sql Server端,可以使用OPENXML将xml文档转换为行集,以便插入到表中。有关OpenXml的信息,请参阅和-这两个链接都包含应该让您开始学习的示例


最后,这是可能的,但通常会从文件中插入数据,我怀疑它是否适合您的场景。

您可以使用XmlSerializer将类序列化为XML,然后将该XML值传递到存储过程中,然后在存储过程中迭代节点。除了XML之外,传递多行数据的另一个选项是使用

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();
<MyClass>
  <Item>
    <ID>1</ID>
    <Property1>prop 1</Property1>
    <Property2>prop 2</Property2>
  </Item>
</MyClass>
作为示例,假设您的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();
<MyClass>
  <Item>
    <ID>1</ID>
    <Property1>prop 1</Property1>
    <Property2>prop 2</Property2>
  </Item>
</MyClass>

可以使用XmlSerializer将类序列化为XML,然后将该XML值传递到存储过程中,然后在存储过程中遍历节点。除了XML之外,传递多行数据的另一个选项是使用

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();
<MyClass>
  <Item>
    <ID>1</ID>
    <Property1>prop 1</Property1>
    <Property2>prop 2</Property2>
  </Item>
</MyClass>
作为示例,假设您的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();
<MyClass>
  <Item>
    <ID>1</ID>
    <Property1>prop 1</Property1>
    <Property2>prop 2</Property2>
  </Item>
</MyClass>


您处理XML仅仅是因为您想通过调用一个存储过程来处理集合中的所有项吗?您处理XML仅仅是因为您想通过调用一个存储过程来处理集合中的所有项吗?OPENXML是SQL Server 2000中分解XML的方法,但在2005年及以后,XML方法尤其是.nodes更受欢迎。@RBarryYoung,注意!虽然我不是Sql专家,但有人告诉我OPENXML在海量数据中更好,因此我提出了这个建议。在谷歌上快速搜索会产生不同的意见——如果你/其他人能遮住一些光线,我会很高兴的。一个链接说,这样的文件或性能分析将更加有利!好吧,性能是相似的,但是XML方法更加灵活和有能力。我看到了性能相似的性能比较,现在找不到链接。我认为问题在于内存使用和可伸缩性:节点和值函数的组合有效地使用XML索引。因此,这种组合比OpenXml具有更大的可伸缩性。OPENXML是在SQL Server 2000中分解XML的方法,但是在2005年及以后,XML方法尤其受欢迎。节点更受欢迎。@RBarryYoung,point注意到!虽然我不是Sql专家,但有人告诉我OPENXML在海量数据中更好,因此我提出了这个建议。在谷歌上快速搜索会产生不同的意见——如果你/其他人能遮住一些光线,我会很高兴的。一个链接说,这样的文件或性能分析将更加有利!好吧,性能是相似的,但是XML方法更加灵活和有能力。我看到了性能相似的性能比较,现在找不到链接。我认为问题在于内存使用和可伸缩性:节点和值函数的组合有效地使用XML索引。因此,这种组合比OpenXml具有更大的可伸缩性。啊!这不需要使用光标…:-@是的,我说可能有更好的方法。如果你愿意,也许你可以发布一个更好的答案,或者提供一个链接,甚至可以编辑我的答案?也许只有我,但没有光标似乎更容易-@RBARYYOUNG:我同意——看起来好多了!啊!这不需要使用光标…:-@是的,我说可能有更好的方法。如果你愿意,也许你可以发布一个更好的答案,或者提供一个链接,甚至可以编辑我的答案?也许只有我,但没有光标似乎更容易-@RBARYYOUNG:我同意——看起来好多了!