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

C# 使用XML数据类型调用存储过程,c#,xml,sql-server-2008,stored-procedures,C#,Xml,Sql Server 2008,Stored Procedures,我只是尝试使用C#调用存储过程(SQLServer2008),并将XMLDocument传递给采用SqlDbType.Xml数据类型的存储过程参数。我收到错误:无法将参数值从XmlDocument转换为字符串。下面是代码示例。如何将XML文档传递给需要XML数据类型的存储过程?谢谢 XmlDocument doc = new XmlDocument(); //Load the the document with the last book node.

我只是尝试使用C#调用存储过程(SQLServer2008),并将XMLDocument传递给采用SqlDbType.Xml数据类型的存储过程参数。我收到错误:无法将参数值从XmlDocument转换为字符串。下面是代码示例。如何将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函数,你可以考虑使用VARBION来存储文件。


更新

谢谢。我让它工作了。添加了以下代码:

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,并且成功了

另一种更简单的方法是将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;

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


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

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

要对
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());

在.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)));

或者,使用最少的代码行,将XmlDocument直接读入XmlNodeReader并使用它初始化SqlXml参数值:

SqlXml sqlXml= new SqlXml(new XmlNodeReader(doc));
cmd.Parameters.Add("@FileContent", sqlXml);


请注意,您不需要将参数与类型一起添加,然后设置值-如果您传递了SqlParameter识别的类型(在本例中为SqlXml对象),则将推断该类型。

您可以使用以下代码创建XML字符串

var doc = new XDocument();
doc.Add(new XElement("x", input.Select(x => new XElement("v", x))));
return doc.ToString();

然后将此文档字符串作为参数传递给存储过程

谢谢。我让它工作了。添加了以下代码:StringWriter sw=new StringWriter();XmlTextWriter xw=新的XmlTextWriter(sw);书面文件(xw);StringReader transactionXml=新的StringReader(sw.ToString());XmlTextReader xmlReader=新的XmlTextReader(transactionXml);SqlXml SqlXml=新的SqlXml(xmlReader);将其转换为字符串是不够的。我得到了以下错误:XML解析:第1行,字符38,无法切换编码”。所以,我将其转换为字符串,然后将其转换为SqlXml,它就工作了
SqlXml sqlXml= new SqlXml(new XmlNodeReader(doc));
cmd.Parameters.Add("@FileContent", sqlXml);

var doc = new XDocument();
doc.Add(new XElement("x", input.Select(x => new XElement("v", x))));
return doc.ToString();