2012-05-10 99 views
0

我想從我的響應數據讀取器對象中讀取列名和類型,因爲我需要它來實例化一些對象。我拿出這個:從數據讀取器加載數據

using (db.sqlConnection) { 
    db.sqlConnection.Open(); 
    using (var cmd = new SqlCommand("areaGetStreetTypes", db.sqlConnection)) { 
     cmd.CommandType = CommandType.StoredProcedure; 
     using (SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.KeyInfo)) { 
      DataTable dt = dr.GetSchemaTable(); 
      foreach (DataRow myField in dt.Rows) { 
       foreach (DataColumn coloana in dt.Columns) { 
        string c1 = coloana.ColumnName; //column name ??? 
        string c2 = coloana.GetType().ToString(); //column type ?? 
        Console.WriteLine(c1 + " " + c2); 
       } 
      } 
     } 
    } 
} 

但是不工作。對於每列返回我想要打印(對於初學者)類似:

id_someID int32  
name string  
surname string  
ssn string 

我的代碼有什麼問題?

+4

是什麼_「不工作」 _ ? – CodeCaster

+0

正如你可以從http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getschematable(v=vs.100).aspx文檔中看到的,GetSchemaTable返回一個數據集,其中每行保存列數據。您正在列出該架構數據集的列而不是行的內容 – Jodrell

+0

如何在一個查詢中接收數據和架構信息?我怎樣才能訪問它們中的每一個? –

回答

3

我想你真正想要的財產以後像

DataTable dt = dr.GetSchemaTable(); 
foreach (DataRow myField in dt.Rows) 
{ 
    var name = myField["ColumnName"]; 
    var type = myField["DataTypeName"]; 
    Console.WriteLine("{0} {1}", name, type); 
}      
+0

是的。這是我正在尋找的答案,現在我不得不將「varchar」轉換爲字符串。 –

+0

@ rhose87模式集中有很多其他列,請查看我評論中的鏈接。有一個名爲「DataType」,其中包含一個.Net類型映射 – Jodrell

+0

type = {Name =「String」FullName =「System.String」} @Jodrell我怎樣才能得到「字符串」? –

1

使用DataColumn.DataType屬性和CommandBehavior.SchemaOnly枚舉成員。

+0

但我也想收到數據。 –

4

不需要調用的GetSchemaTable獲得的數據類型爲每個列,因爲讀者已經具備了所有這些細節

SqlCommand cmd = new SqlCommand(strSql, sqlConn); 
SqlDataReader sdr; 
sdr = cmd.ExecuteReader(); 
for (int i = 0; i < sdr.FieldCount; i++) 
{ 
    string dataTypeName = sdr.GetDataTypeName(i); // Gets the type of the specified column in SQL Server data type format 
    string FullName = sdr.GetFieldType(i).FullName; // Gets the type of the specified column in .NET data type format 
    string specificfullname = sdr.GetProviderSpecificFieldType(i).FullName; //Gets the type of the specified column in provider-specific format 
    //Now print the values 
} 
+0

模式表是一個基於0的數組?我如何訪問列名? –

+0

@ rhose87'sdr.GetName(i)'會給你列的名字。 – nawfal

+0

+1信息。但爲什麼你放棄你的'for'循環中的最後一列呢? – nawfal