使用XML数据类型调用存储过程

我只是尝试使用C#调用存储过程(SQL Server 2008)并将XMLDocument传递给采用SqlDbType.Xml数据类型的存储过程参数。 我收到错误:无法将参数值从XmlDocument转换为String。 下面是代码示例。 如何将XML文档传递给期望XML数据类型的存储过程? 谢谢。

XmlDocument doc = new XmlDocument(); //Load the the document with the last book node. XmlTextReader reader = new XmlTextReader(@"C:\temp\" + uploadFileName); reader.Read(); // load reader doc.Load(reader); connection.Open(); SqlCommand cmd = new SqlCommand("UploadXMLDoc", connection); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("@Year", SqlDbType.Int); cmd.Parameters["@Year"].Value = iYear; cmd.Parameters.Add("@Quarter", SqlDbType.Int); cmd.Parameters["@Quarter"].Value = iQuarter; cmd.Parameters.Add("@CompanyID", SqlDbType.Int); cmd.Parameters["@CompanyID"].Value = iOrganizationID; cmd.Parameters.Add("@FileType", SqlDbType.VarChar); cmd.Parameters["@FileType"].Value = "Replace"; cmd.Parameters.Add("@FileContent", SqlDbType.Xml); cmd.Parameters["@FileContent"].Value = doc; cmd.Parameters.Add("@FileName", SqlDbType.VarChar); cmd.Parameters["@FileName"].Value = uploadFileName; cmd.Parameters.Add("@Description", SqlDbType.VarChar); cmd.Parameters["@Description"].Value = lblDocDesc.Text; cmd.Parameters.Add("@Success", SqlDbType.Bit); cmd.Parameters["@Success"].Value = false; cmd.Parameters.Add("@AddBy", SqlDbType.VarChar); cmd.Parameters["@AddBy"].Value = Page.User.Identity.Name; cmd.ExecuteNonQuery(); connection.Close(); 

您需要将xml作为字符串传递。

但是,如果您不需要数据库中的xml函数,则可以考虑使用varbinary来存储文件。


UPDATE !!!!!

谢谢。 我得到了它的工作。 添加了以下编码:

 StringWriter sw = new StringWriter(); XmlTextWriter xw = new XmlTextWriter(sw); doc.WriteTo(xw); StringReader transactionXml = new StringReader(sw.ToString()); XmlTextReader xmlReader = new XmlTextReader(transactionXml); SqlXml sqlXml = new SqlXml(xmlReader); 

将它转换为字符串是不够的。 我收到以下错误:XML解析:第1行,第38个字符,无法切换编码“。 所以,我转换为字符串,然后将它转换为SqlXml,它的工作原理。

要使用XDocumentXElement或其他XNode执行此操作,请尝试以下操作:

 XDocument doc = new XDocument( new XElement("Person", new XAttribute("Name", "John"))); cmd.Parameters.Add("@FileContent", SqlDbType.Xml); cmd.Parameters["@FileContent"].Value = new SqlXml(doc.CreateReader()); 

如果您不介意丢失xml声明(版本和编码),其他方法就是:

 XML.DocumentElement.OuterXml 'where XML is a XMLDocument 

你可以用更简单的方式添加参数,这样我们就不必将对象类型传递给参数sql将其作为传递值进行管理

 SqlXml sqlXml = new SqlXml(xmlReader); cmd.Parameters.AddWithValue("@FileContent"], strxml); 

另一种更简单的方法是将xmldoc写入字符串并将其传递给存储过程。

 Dim sb As New StringBuilder() Dim wrtr As New System.IO.StringWriter(sb) doc.Save(wrtr) Dim strxml As String = sb.ToString() cmd.Parameters.Add("@FileContent", SqlDbType.Xml); cmd.Parameters["@FileContent"].Value =strxml; 

在.NET Framework 4.5.2中,我能够使用以下简单代码传递System.Xml.XmlDocument(变量名称“xdoc”)对象:

 XmlTextReader xreader = new XmlTextReader(new StringReader(xdoc.OuterXml)); cmd.Parameters.Add(new SqlParameter("@xmlOptions", new SqlXml(xreader))); 
 public static string SerializeToXml(T obj) { XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("",""); StringWriter Output = new StringWriter(new StringBuilder()); XmlSerializer ser = new XmlSerializer(obj.GetType); ser.Serialize(Output, obj, ns); return Output.ToString(); }