2010-06-23 26 views
8

Mam zapytanie SQL, które otrzymuję z pliku konfiguracyjnego, to zapytanie zwykle zawiera 3-6 złączeń.Jak uzyskać nazwę tabeli kolumny z SqlDataReader

Muszę znaleźć w czasie wykonywania, w oparciu o zestaw wyników reprezentowany przez SqlDataReader, aby znaleźć nazwę tabela dla każdej kolumny.

Oto kilka rzeczy, które nie działają:

  • SqlDataReader.GetName zwraca nazwę kolumny, ale nie nazwa tabeli.
  • SqlDataReader.GetSchemaTable zwraca tabelę danych z informacjami o kolumnie - ale wszystkie nazwy tabel mają wartość null.
  • Zapytanie information_schema nie pomaga, ponieważ potrzebuję danych o wynikach bieżącego zapytania (a nazwy kolumn nie są unikalne - w różnych tabelach znajdują się kolumny o tej samej nazwie).

Używam .net 3.5SP1/C#/SQL Server 2008 w aplikacji konsoli.

EDIT: wiem, że to nie jest możliwe dla wszystkich przypadkach ponieważ „kolumna” można łączyć z wielu tabel, funkcja lub nawet stałą słowa - Szukam czegoś, co działa w prostym przypadku.

EDIT 2: Okazało się, dlaczego to nie działa - można użyć SqlDataReader.GetSchemaTable aby uzyskać informacje na stolik, ale trzeba ustawić CommandBehavior do KeyInfo, możesz to zrobić w zaproszeniu ExecuteReader:

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

nie jestem pewien, że będziesz w stanie to zrobić na podstawie wynikowego. Prawdopodobnie będziesz musiał przeanalizować SQL - dlaczego tego potrzebujesz? – Paddy

Odpowiedz

10

Można użyć SqlDataReader.GetSchemaTable aby uzyskać informacje na stolik, ale trzeba ustawić CommandBehavior do KeyInfo, możesz to zrobić w zaproszeniu ExecuteReader:

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

Nie wiem, czy ta informacja jest dostępna. W szczególności nie wszystkie kolumny zestawu wyników pochodzą z tabeli. Z relacyjnego punktu widzenia tabele i zestawy wyników są tym samym.

2

Ten unanswered question na stackoverflow używa SqlDataReader.GetSchemaTable, aby uzyskać nazwę tabeli. Ich problemem jest to, że zwraca rzeczywistą nazwę tabeli zamiast aliasu, który ma tabela. Nie wiem, czy to działa z twoim sql, ale pomyślałem, że dam ci znać na wszelki wypadek.

1

W ogóle, to nie jest możliwe. Rozważ następujące zapytanie:

SELECT col1 FROM table1 
UNION ALL 
SELECT col1 FROM table2 

Oczywiście col1 pochodzi z więcej niż jednego stołu.

1

można go rozwiązać tak:

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()); 
} 
Powiązane problemy