2009-11-08 15 views
6

Estoy intentando simplemente llamar a un procedimiento de tienda (SQL Server 2008) usando C# y pasando XMLDocument a un parámetro de procedimiento de tienda que toma un tipo de datos SqlDbType.Xml. Recibo un error: no se pudo convertir el valor del parámetro de XmlDocument a String. A continuación se muestra el código. ¿Cómo pasa un documento XML a un procedimiento de almacenamiento que espera un tipo de datos XML? Gracias.Llamar a un procedimiento almacenado con XML Datatype

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

Respuesta

8

Debe pasar el xml como una cadena.

Pero si no necesita las funciones xml en la base de datos, puede considerar el uso de varbinary para almacenar los archivos.


UPDATE !!!!!

Gracias. Yo tengo que trabajar. Agregado el siguiente código:

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

Convertirlo a una cadena no fue suficiente. Obtuve el siguiente error: análisis XML: línea 1, carácter 38, no se puede cambiar la codificación ". Entonces, convertí a cadena y luego lo convertí en SqlXml y funcionó.

+0

Gracias. Yo tengo que trabajar. Se agregó el siguiente código: 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); Convertirlo en una cadena no fue suficiente. Obtuve el siguiente error: análisis XML: línea 1, carácter 38, no se puede cambiar la codificación ". Entonces, convertí a cadena y luego lo convertí en SqlXml y funcionó. – Lakeshore

+2

Puede tomar un enfoque más simple: 'cmd.Parameters [" @ FileContent "]. Value = new SqlXml (File.OpenRead (" file.xml "));' –

0

Otra forma más sencilla es escribir el xmldoc en una cadena y pasarlo al procedimiento almacenado.

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; 
2

Otra manera de hacerlo si no le importa perder la declaración XML (versión y codificación) es simplemente:

XML.DocumentElement.OuterXml 'where XML is a XMLDocument 
1

puede agregar el parámetro de una manera más simple de esta manera no tienen que pasar tipo de objeto al parámetro SQL maneja como valor pasado

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

para hacer esto con un XDocument, XElement u otro XNode, intente lo siguiente:

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()); 
0

En .NET Framework 4.5.2, yo era capaz de pasar una System.Xml.XmlDocument ("xdoc" nombre de variable) objeto utilizando el siguiente código simple:

XmlTextReader xreader = new XmlTextReader(new StringReader(xdoc.OuterXml)); 
cmd.Parameters.Add(new SqlParameter("@xmlOptions", new SqlXml(xreader))); 
Cuestiones relacionadas