2010-06-23 15 views
8

Tengo una consulta SQL que obtengo de un archivo de configuración, esta consulta generalmente contiene 3-6 combinaciones.Cómo obtener el nombre de la tabla de una columna de SqlDataReader

Necesito encontrar en tiempo de ejecución, en función del conjunto de resultados representado por SqlDataReader, para encontrar el nombre de la tabla para cada columna.

Estas son algunas cosas que no funcionan:

  • SqlDataReader.GetName devuelve el nombre de la columna, pero no el nombre de la tabla.
  • SqlDataReader.GetSchemaTable devuelve una tabla de datos con información de columna, pero todos los nombres de tabla son nulos.
  • Consultar information_schema no ayuda porque necesito datos sobre los resultados de la consulta actual (y los nombres de las columnas no son únicos, hay columnas con el mismo nombre en diferentes tablas).

Estoy usando .net 3.5SP1/C#/SQL Server 2008 en una aplicación de consola.

EDIT: Sé que esto no es posible en todos los casos ya que una "columna" se puede combinar de varias tablas, una función o incluso una expresión constante - Estoy buscando algo que funcione en el caso simple.

EDIT 2: descubrí por qué no funcionó - Se puede usar SqlDataReader.GetSchemaTable para obtener información de la tabla, pero hay que establecer CommandBehavior a KeyInfo, lo hace en la llamada ExecuteReader:

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

No estoy seguro de que vas a ser capaz de hacer esto con base en el conjunto de resultados. Probablemente necesite analizar el SQL en su lugar, ¿por qué lo necesita? – Paddy

Respuesta

10

Puede utilizar SqlDataReader.GetSchemaTable para obtener información de la tabla, pero hay que establecer CommandBehavior a KeyInfo, lo hace en la llamada ExecuteReader:

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

No sé si esta información está disponible. En particular, no todas las columnas de un conjunto de resultados provienen de una tabla. Desde un punto de vista relacional, las tablas y los resultados son lo mismo.

2

Este unanswered question en stackoverflow usa SqlDataReader.GetSchemaTable para obtener el nombre de la tabla. Su problema es que devuelve el nombre real de la tabla en lugar del alias que tiene la tabla. No estoy seguro de si esto funciona con su sql, pero pensé que le haría saber por si acaso.

1

En general, esto no es posible. Considere la siguiente consulta:

SELECT col1 FROM table1 
UNION ALL 
SELECT col1 FROM table2 

Clearly col1 viene de más de una tabla.

1

se puede resolver como la siguiente:

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()); 
} 
Cuestiones relacionadas