2010-06-23 25 views
8

Ho una query SQL che ottengo da un file di configurazione, questa query contiene solitamente 3-6 join.Come ottenere il nome della tabella di una colonna da SqlDataReader

Ho bisogno di trovare in fase di esecuzione, in base al set di risultati rappresentato da SqlDataReader, per trovare il nome della tabella per ogni colonna.

Ecco alcune cose che non funzionano:

  • SqlDataReader.GetName restituisce il nome di colonna, ma non il nome della tabella.
  • SqlDataReader.GetSchemaTable restituisce una tabella di dati con informazioni sulla colonna, ma tutti i nomi delle tabelle sono nulli.
  • L'interrogazione di information_schema non aiuta perché ho bisogno di dati sui risultati della query corrente (e i nomi delle colonne non sono univoci - ci sono colonne con lo stesso nome in tabelle diverse).

Utilizzo .net 3.5SP1/C#/SQL Server 2008 in un'applicazione console.

EDIT: So che questo non è possibile in tutti i casi poiché una "colonna" può essere combinata da più tabelle, una funzione o anche un'espressione costante - Sto cercando qualcosa che funzioni nel caso semplice.

EDIT 2: scoperto perché non ha funzionato - È possibile utilizzare SqlDataReader.GetSchemaTable per ottenere informazioni tavolo, ma è necessario impostare CommandBehavior a KeyInfo, hai fatto nella chiamata ExecuteReader:

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

io non sono sicuro che si sta andando ad essere in grado di farlo sulla base di risultati. Probabilmente avrai bisogno di analizzare SQL, perché ne hai bisogno? – Paddy

risposta

10

È possibile utilizzare SqlDataReader.GetSchemaTable per ottenere informazioni tavolo, ma è necessario impostare CommandBehavior a KeyInfo, hai fatto nella chiamata ExecuteReader:

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

Non so se questa informazione è disponibile. In particolare, non tutte le colonne di un set di risultati provengono da una tabella. Da un punto di vista relazionale, le tabelle e i risultati sono la stessa cosa.

2

Questo unanswered question su stackoverflow utilizza SqlDataReader.GetSchemaTable per ottenere il nome della tabella. Il loro problema è che restituisce il nome effettivo della tabella piuttosto che l'alias della tabella. Non sono sicuro se questo funziona con il tuo sql ma ho pensato di farti sapere per ogni evenienza.

1

In generale, questo non è possibile. Si consideri la seguente query:

SELECT col1 FROM table1 
UNION ALL 
SELECT col1 FROM table2 

Chiaramente col1 proviene da più di una tabella.

1

si può risolvere come il seguente:

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()); 
} 
Problemi correlati