2012-08-28 20 views
8

¿Es posible usar GetSchemaTable() para recuperar solo los nombres de las columnas?Usando GetSchemaTable() para recuperar solo los nombres de las columnas

He intentado recuperar los nombres de las columnas (solo) con este método, ¿es posible?

DataTable table = myReader.GetSchemaTable(); 

    foreach (DataRow myField in table.Rows) 
    { 
     foreach (DataColumn myProperty in table.Columns) 
     { 
      fileconnectiongrid.Rows.Add(myProperty.ColumnName + " = " 
          + myField[myProperty].ToString()); 
     } 
    } 

Este código recupera una gran cantidad de datos de la tabla no deseado, solamente necesito una lista que contiene los nombres de columna !:

Respuesta

17

Es necesario utilizar ExecuteReader(CommandBehavior.SchemaOnly)):

DataTable schema = null; 
using (var con = new SqlConnection(connection)) 
{ 
    using (var schemaCommand = new SqlCommand("SELECT * FROM table", con)) 
    { 
     con.Open(); 
     using (var reader = schemaCommand.ExecuteReader(CommandBehavior.SchemaOnly)) 
     { 
      schema = reader.GetSchemaTable(); 
     } 
    } 
} 

SchemaOnly:

La consulta solo devuelve información de la columna. Al utilizar SchemaOnly, el proveedor de datos de Framework .NET para SQL Server precede a la declaración que se está ejecutando con SET FMTONLY ON.

El nombre de la columna está en la primera columna de cada fila. No creo que sea posible omitir las otras informaciones de columna como ColumnOrdinal,ColumnSize,NumericPrecision, etc., ya que no puede usar reader.GetString, sino solo reader.GetSchemaTable en este caso.

Pero su bucle es incorrecto si solo deseas los nombres de columna:

foreach (DataRow col in schema.Rows) 
{ 
    Console.WriteLine("ColumnName={0}", col.Field<String>("ColumnName")); 
} 
+0

sigue devolviendo todos los datos :-(tal vez algo malo con mi bucle – user1495962

+0

@ user1495962:.. El nombre de la columna se encuentra en la primera columna de cada fila no creo que es posible omitir el otras informaciones de columna como 'ColumnOrdinal, ColumnSize, NumericPrecision' etc. ** Editado mi respuesta ** –

+0

Esto funciona thx! – user1495962

0

cambiar su código a continuación si lo que quieres es para mostrar los nombres de las columnas. El código original intentaba no solo mostrar los nombres de las columnas, sino también tratar de mostrar los valores de los datos reales.

DataTable table = myReader.GetSchemaTable(); 

foreach (DataRow myField in table.Rows) 
{ 
    foreach (DataColumn myProperty in table.Columns) 
    { 
     fileconnectiongrid.Rows.Add(myProperty.ToString()); 
    } 
} 
+0

tr yid configurándolo sin suerte – user1495962

0

Esto le dará todos los nombres de columna, puede colocarlos en una string[] y hacer con ellos lo que te gusta.

foreach(var columnName in DataTable.Columns) 
{ 
    Console.WriteLine(columnName); 
} 
0
//Retrieve column schema into a DataTable. 
schemaTable = reader.GetSchemaTable(); 

int index = schemaTable.Columns.IndexOf("ColumnName"); 
DataColumn columnName = schemaTable.Columns[index]; 

//For each field in the table... 
foreach (DataRow myField in schemaTable.Rows) 
    { 
    String columnNameValue = myField[columnName].ToString(); 
    Console.WriteLine("ColumnName " + columnNameValue); 
    } 
Cuestiones relacionadas