2010-11-21 34 views
1

DataTable içine [xml auto, elementler için] ben XML döndüren MS SQL Server saklı yordam (o xml oto için ile SEÇ kullanır elemanları)Oku ADO.NET

DataTable içine okumak çalıştı sahip :

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

ama retTable ayrılmış tam xml thar SQL Server dönüşleri ile 12 satır içerir.

Bu XML'i DB'den DataTable nesnesine nasıl okuyabilirim? Teşekkürler!

+0

Sorunu anladığımdan emin değilim; Geri aldığınız XML'i bir tabloya ayırmaya mı çalışıyorsunuz? Eğer öyleyse, o zaman neden ilk etapta XML'e çeviriyorsunuz? –

cevap

0

Tam olarak burada ne yapmaya çalışıyorsunuz? Saklı yordamda bir XML alanı oluşturuyormuşsunuz gibi geliyor ve DataTable'ınıza tam olarak tek bir XML alanı olarak yerleştiriliyor. Bu beklenen bir davranış. Öyleyse, en büyük soru, yukarıdaki yorumlarda da belirtildiği gibi, kodda bir tablo olmasını istiyorsanız, ilk önce XML'de oluşturulan veri nedenidir?

Yapabileceğiniz bir şey, döndürülen alanlardan ihtiyacınız olan verileri almak için döndürülen sonuçların sorgulanması için LINQ to XML (veya XML DOM ayrıştırmada bazı benzer yaklaşım) kullanmaktır. Tablo verileriyle çalışmayı beklediğinizden ve LINQ'un buna "SQL hissini" sahip olduğundan oldukça basit hissetmeniz gerekir.

Bu soruda eksik olan önemli bir nokta, ancak tablolar ve XML arasındaki yapısal farktır. Tablolar ilişkisel, XML hiyerarşiktir. Verileri tamamen farklı şekillerde temsil edecek şekilde tasarlandılar. Bu, döndürülen XML'in'un doğrudan tek bir DataTable nesnesine dönüştürülmesinin mümkün olmadığı söylenebilir. Sadece bir veri tablosunu temsil etmeyebilir.

+0

Ne yazık ki SP bu XML'i döndürür, o kadar çok SP'yi kullandığım gibi değiştiremiyorum. Cevap için teşekkürler! – 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;