2009-11-08 4 views
6

J'essaie simplement d'appeler une procédure de stockage (SQL Server 2008) à l'aide de C# et de passer XMLDocument à un paramètre de procédure de magasin qui prend un type de données SqlDbType.Xml. J'obtiens l'erreur: Échec de convertir la valeur de paramètre d'un XmlDocument en chaîne. Voici un exemple de code. Comment passez-vous un document XML à une procédure de magasin qui attend un type de données XML? Merci.Appel d'une procédure stockée avec le type de données 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(); 

Répondre

8

Vous devez transmettre le fichier XML en tant que chaîne.

Mais si vous n'avez pas besoin des fonctions xml dans la base de données, vous pouvez envisager d'utiliser varbinary pour stocker les fichiers.


MISE À JOUR !!!!!

Merci. Je l'ai eu pour travailler. Ajout du code suivant:

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

La conversion en chaîne n'était pas suffisante. J'ai l'erreur suivante: XML analyse: ligne 1, caractère 38, impossible de changer l'encodage ". Donc, j'ai converti en chaîne, puis l'a converti en SqlXml et cela a fonctionné.

+0

Merci. Je l'ai eu pour travailler. Ajouté le codé suivant: 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 = nouveau SqlXml (xmlReader); La conversion en chaîne n'était pas suffisante. J'ai l'erreur suivante: XML analyse: ligne 1, caractère 38, impossible de changer l'encodage ". Donc, j'ai converti en chaîne, puis l'a converti en SqlXml et cela a fonctionné. – Lakeshore

+2

Vous pouvez adopter une approche plus simple: 'cmd.Parameters [" @ FileContent "]. Value = new SqlXml (File.OpenRead (" fichier.xml "))' –

0

Une autre façon plus simple consiste à écrire le xmldoc dans une chaîne et de le passer à la procédure stockée.

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

Autre façon de le faire si cela ne vous dérange pas perdre la déclaration xml (version et encodage) est juste:

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

vous pouvez ajouter le paramètre de manière plus simple de cette façon nous ne pas passer le type d'objet au paramètre sql qu'elle gère comme valeur passée

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

pour ce faire, avec un XDocument, XElement ou autre XNode, essayez ce qui suit:

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

Dans .NET Framework 4.5.2, j'ai pu passer un objet System.Xml.XmlDocument (nom de la variable "xdoc") en utilisant le code simple suivant:

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