2009-11-08 5 views
6

Я просто пытаюсь вызвать процедуру хранения (SQL Server 2008) с помощью C# и передать XMLDocument параметру процедуры хранения, который принимает тип данных SqlDbType.Xml. Я получаю ошибку: Не удалось преобразовать значение параметра из XmlDocument в String. Ниже приведен пример кода. Как передать XML-документ в процедуру хранилища, которая ожидает тип данных 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(); 

ответ

8

Вам необходимо передать xml в виде строки.

Но если вам не нужны функции xml в базе данных, вы можете использовать varbinary для хранения файлов.


ОБНОВЛЕНИЕ !!!!!

Спасибо. Я заработал. Добавлено следующее кодированное:

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, и она сработала.

+0

Спасибо. Я заработал. Добавлено следующее кодированное: StringWriter sw = new StringWriter(); XmlTextWriter xw = новый XmlTextWriter (sw); doc.WriteTo (xw); StringReader transactionXml = new StringReader (sw.ToString()); XmlTextReader xmlReader = новый XmlTextReader (transactionXml); SqlXml sqlXml = новый SqlXml (xmlReader); Преобразование его в строку было недостаточно. Я получил следующую ошибку: XML-синтаксический анализ: строка 1, символ 38, неспособная переключить кодировку ». Итак, я преобразовал в строку, затем спрятал ее в SqlXml, и она сработала. – Lakeshore

+2

Вы можете использовать более простой подход: 'cmd.Parameters [" @ FileContent "]. Value = new SqlXml (File.OpenRead (" file.xml "));' –

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

Другой способ сделать это, если вы не против потери декларации XML (версии и кодирования) просто:

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

вы можете добавить параметр в более простой способ таким образом мы не должны передать тип объекта к параметру SQL управляет как переданным значением

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

чтобы сделать это с помощью 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()); 
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))); 
Смежные вопросы