2009-11-08 5 views
6

C#을 사용하여 저장 프로 시저 (SQL Server 2008)를 호출하고 SqlDbType.Xml 데이터 형식을 사용하는 저장 프로 시저 매개 변수에 XMLDocument를 전달하려고합니다. 오류가 발생합니다 : 매개 변수 값을 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,이 작업을 수행하려면또는 다른 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 프레임 워크 4.5.2, 나는 다음과 같은 간단한 코드를 사용 (변수 이름 "xdoc") 객체를 System.Xml.XmlDocument을 통과 할 수 있었다 :

XmlTextReader xreader = new XmlTextReader(new StringReader(xdoc.OuterXml)); 
cmd.Parameters.Add(new SqlParameter("@xmlOptions", new SqlXml(xreader))); 
관련 문제