2010-06-23 247 views
8

我有一個從配置文件中得到的SQL查詢,這個查詢通常包含3-6個連接。如何從SqlDataReader獲取列名的表名

我需要在運行時根據SqlDataReader表示的結果集查找每列的表名。

這裏有一些事情,不工作:

  • SqlDataReader.GetName返回列名而不是表名。
  • SqlDataReader.GetSchemaTable返回一個包含列信息的數據表 - 但所有的表名都是空的。
  • 查詢information_schema沒有幫助,因爲我需要有關當前查詢結果的數據(並且列名不唯一 - 在不同表中有相同名稱的列)。

我在控制檯應用程序中使用.net 3.5SP1/C#/ SQL Server 2008。

編輯:我知道這是不可能的所有情況下,因爲「列」可以從多個表,一個函數,甚至是一個常量表達式 - 我正在尋找的東西,在簡單的情況下工作。

編輯2:找到了原因沒有奏效 - 您可以使用SqlDataReader.GetSchemaTable獲取表信息,但你要的CommandBehavior設置的密鑰信息,你做的是,在通話的ExecuteReader:

reader = cmd.ExecuteReader(CommandBehavior.KeyInfo); 
+0

我不知道你要能夠根據結果集來做到這一點。你可能需要解析SQL,爲什麼你需要這個? – Paddy 2010-06-23 15:10:18

回答

10

您可以使用SqlDataReader.GetSchemaTable獲取表信息,但你要的CommandBehavior設置的密鑰信息,你做的是,在通話的ExecuteReader:

reader = cmd.ExecuteReader(CommandBehavior.KeyInfo); 
2

我不知道這些信息是否可用。特別是,並非結果集的所有列都來自表格。從關係的角度來看,表和結果集是一回事。

2

這個unanswered question在stackoverflow使用SqlDataReader.GetSchemaTable來獲取表名。他們的問題是它返回實際的表名而不是表所具有的別名。不知道這是否適用於你的SQL,但我想讓你知道以防萬一。

1

一般情況下,這是不可能的。考慮以下查詢:

SELECT col1 FROM table1 
UNION ALL 
SELECT col1 FROM table2 

顯然col1來自多個表。

1

你可以解決它類似如下:

DataTable schemaTable = sqlReader.GetSchemaTable(); 

foreach (DataRow row in schemaTable.Rows) 
{ 
    foreach (DataColumn column in schemaTable.Columns) 
    { 
     MessageBox.Show (string.Format("{0} = {1}", column.ColumnName, row[column])); 
    } 
} 
0
SqlCeConnection conn = new SqlCeConnection("Data Source = Database1.sdf"); 
SqlCeCommand query = conn.CreateCommand(); 
query.CommandText = "myTableName"; 
query.CommandType = CommandType.TableDirect; 
conn.Open(); 
SqlCeDataReader myreader = query.ExecuteReader(CommandBehavior.KeyInfo); 
DataTable myDataTable= myreader.GetSchemaTable(); 
//thats the code you asked. in the loop 
for (int i = 0; i < myDataTable.Rows.Count; i++) 
{ 
    listView1.Columns.Add(myDataTable.Rows[i][0].ToString()); 
}