2009-11-08 18 views
6

Po prostu próbuję wywołać procedurę sklepu (SQL Server 2008) za pomocą C# i przekazanie XMLDocument do parametru procedury składowania, który pobiera typ danych SqlDbType.Xml. Otrzymuję błąd: Nie można przekonwertować wartości parametru z XmlDocument na ciąg. Poniżej znajduje się przykład kodu. W jaki sposób przekazujesz dokument XML do procedury sklepu, która oczekuje typu danych XML? Dzięki.Wywołanie procedury składowanej o typach danych 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(); 

Odpowiedz

8

Musisz przekazać xml jako ciąg znaków.

Ale jeśli nie potrzebujesz funkcji xml w bazie danych, możesz rozważyć użycie varbinary do przechowywania plików.


AKTUALIZACJA !!!!!

Dzięki. Mam to do pracy. Dodano następujące kodowane:

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

Konwersja na ciąg nie była wystarczająca. Pojawił się następujący błąd: parsowanie XML: wiersz 1, znak 38, nie można zmienić kodowania ". Więc przekonwertowałem na string, a następnie zakryłem go do SqlXml i działało.

+0

Dzięki. Mam to do pracy. Dodano następujące kodowane: StringWriter sw = new StringWriter(); XmlTextWriter xw = nowy XmlTextWriter (sw); doc.WriteTo (xw); StringReader transactionXml = new StringReader (sw.ToString()); XmlTextReader xmlReader = nowy XmlTextReader (transactionXml); SqlXml sqlXml = new SqlXml (xmlReader); Konwersja na ciąg nie była wystarczająca. Pojawił się następujący błąd: parsowanie XML: wiersz 1, znak 38, nie można zmienić kodowania ". Więc przekonwertowałem na string, a następnie zakryłem go do SqlXml i działało. – Lakeshore

+2

Możesz przyjąć prostsze podejście: 'cmd.Parameters [" @ FileContent "]. Value = new SqlXml (File.OpenRead (" file.xml "));' –

0

Innym prostszym sposobem jest napisanie xmldoc do napisu i przekazanie go do procedury przechowywanej.

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

Inny sposób to zrobić, jeśli nie przeszkadza tracąc deklaracji XML (wersja i kodowania) jest po prostu:

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

można dodać parametr w bardziej prostszy sposób w ten sposób nie muszą przechodzić typ obiektu do parametru SQL zarządza nim jak przekazane wartości

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

aby to zrobić z XDocument, XElement lub inny XNode, spróbuj wykonać następujące czynności:

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

W .NET Framework 4.5.2, udało mi się zdać System.Xml.XmlDocument (zmienna name "xdoc") za pomocą następującego obiektu prosty kod:

XmlTextReader xreader = new XmlTextReader(new StringReader(xdoc.OuterXml)); 
cmd.Parameters.Add(new SqlParameter("@xmlOptions", new SqlXml(xreader))); 
Powiązane problemy