2010-11-21 3 views
1

에서의 DataTable에 [XML 자동, 요소] 나는 XML 반환 MS SQL Server 저장 프로 시저 (가 XML 자동차에 대한 와 SELECT 사용 요소)읽기 ADO.NET

내가 DataTable을로 읽어 시도가 :

  DataTable retTable = new DataTable(); 
      SqlCommand comm = new SqlCommand("exec MySP", connection); 
      SqlDataAdapter da = new SqlDataAdapter(comm); 
      connection.Open(); 
      da.Fill(retTable); 

retTable에는 SQL Server가 반환하는 전체 xml thar가있는 12 개의 행이 있습니다.

DB에서 DataTable 개체로 XML을 어떻게 읽을 수 있습니까? 감사합니다.

+0

잘 모르겠습니다. 당신이 테이블에 다시 XML을 파쇄하려고합니까? 그렇다면 왜 XML로 바꾸는 것입니까? –

답변

0

여기서 정확히 무엇을하려고합니까? 스토어드 프로 시저에서 XML 필드를 구축하는 것처럼 들리며 DataTable에 정확하게 하나의 XML 필드로 배치됩니다. 이는 예상되는 동작입니다. 그래서 위의 설명에서 질문 한 것처럼 가장 큰 질문은 코드에서 테이블이되기를 원한다면 왜 데이터가 XML로 형성되는 것입니까?

반환 할 수있는 필드에서 필요한 데이터를 얻기 위해 반환 된 결과를 쿼리하려면 LINQ to XML (또는 XML DOM 구문 분석과 비슷한 방식)을 사용하면됩니다. 테이블 데이터로 작업 할 것으로 예상되므로 LINQ에 "SQL 느낌"이 있으므로 상당히 간단합니다.

그러나이 질문에서 누락 될 수있는 중요한 점 중 하나는 테이블과 XML의 구조적 차이입니다. 테이블은 관계형이며 XML은 계층 적입니다. 이들은 완전히 다른 방식으로 데이터를 표현하도록 설계되었습니다. 즉, 이 반환되는 XML은을 단일 DataTable 객체로 직접 변환 할 수 없다는 것이 전적으로 가능합니다. 단지 데이터 테이블을 나타내지 않을 수도 있습니다.

+0

불행히도 SP가 해당 XML을 반환하기 때문에 여러 곳에서 사용하는 하드 SP를 변경할 수는 없습니다. 답변 감사합니다! – ihorko

0
DataSet retTable = new DataSet(); 
SqlConnection con = new SqlConnection("data source=servername;initial catalog=databasename;uid=userid;pwd=password"); 
SqlCommand cmd = new SqlCommand("GetMyXmlDate", con); 
cmd.CommandType = CommandType.StoredProcedure; 
con.Open(); 
string xmlDoc = ""; 
using (XmlReader reader = cmd.ExecuteXmlReader()) 
{ 
    while (reader.Read()) 
    { 
    xmlDoc = xmlDoc + reader.ReadOuterXml(); 
    } 
} 

var dataStream = new MemoryStream(); 
var dataWriter = new StreamWriter(dataStream); 
dataWriter.Write(xmlDoc); 
dataWriter.Flush(); 
dataStream.Position = 0; 
retTable.ReadXml(dataStream); 
Grid.DataSource = retTable.Tables[0].DefaultView;