我只是尝试使用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();
答案 0 :(得分:8)
您需要将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,它的工作原理。
答案 1 :(得分:3)
要使用XDocument
,XElement
或其他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());
答案 2 :(得分:2)
如果您不介意丢失xml声明(版本和编码),其他方法就是:
XML.DocumentElement.OuterXml 'where XML is a XMLDocument
答案 3 :(得分:2)
您可以使用以下代码创建XML字符串
var doc = new XDocument();
doc.Add(new XElement("x", input.Select(x => new XElement("v", x))));
return doc.ToString();
,然后将此文档字符串作为参数传递给存储过程
答案 4 :(得分:1)
您可以更简单的方式添加参数 这样我们就不必将对象类型传递给参数了 sql将其作为传递值
进行管理SqlXml sqlXml = new SqlXml(xmlReader);
cmd.Parameters.AddWithValue("@FileContent"], strxml);
答案 5 :(得分:0)
另一种更简单的方法是将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;
答案 6 :(得分:0)
在.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)));
答案 7 :(得分:0)
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();
}
答案 8 :(得分:0)
或者,用最少的代码行,将XmlDocument直接读入XmlNodeReader,然后使用它来初始化SqlXml参数值:
SqlXml sqlXml= new SqlXml(new XmlNodeReader(doc));
cmd.Parameters.Add("@FileContent", sqlXml);
请注意,您不需要添加带有类型的参数,然后设置值-如果您传递SqlParameter可以识别的类型(在本例中为SqlXml对象),则将推断类型。