2011-08-23 39 views
13

que tengo una vista vwGetData que obtiene los datos de dos tablas t1, t2 y tiene campos:Obtener nombres de las columnas de una consulta sin datos

t1.Field1 [ALIAS1], t1.Field2, t2.Field3, t2.Field4, t2.Field5 [ALIAS5] 

voy a dar a continuación la entrada

Select * from vwGetData 

quiero para conseguir debajo de la salida en C#/SQL

ALIAS1 
Field2 
Field3 
Field4 
ALIAS5 

o

ALIAS1, Field2, Field3, Field4, ALIAS5 

Quiero hacer esto usando C# y SQL.

+0

¿Cómo se relacionan las dos tablas entre sí? – Curt

+3

tal vez solo agregue "donde 1 = 0" e inspeccione las columnas devueltas? –

+0

publica el código que has escrito hasta ahora? ¿Y cuál parece ser el problema? – Waqas

Respuesta

25

Lo primero que haría es asegurarse de que ningún dato se volvió:

SELECT TOP 0 [vwGetData].* FROM [vwGetData] WHERE 1 = 2; 

Ahora suponiendo que conoce cómo configurar una DataReader haría lo siguiente:

using(var reader = command.ExecuteReader()) 
{ 
    // This will return false - we don't care, we just want to make sure the schema table is there. 
    reader.Read(); 

    var tableSchema = reader.GetSchemaTable(); 

    // Each row in the table schema describes a column 
    foreach (DataRow row in tableSchema.Rows) 
    { 
    Console.WriteLine(row["ColumnName"]); 
    } 
} 

También puede consultar el SQL Catalog SYS Views.

+0

esto es lo que necesitaba TOP 0 lo hace :) – Thakur

+0

también podría usar SELECT TOP 0 [vwGetData]. * FROM [vwGetData] WHERE 1 = 2; –

+0

¡Buena idea @MarkKram gracias! –

11
SELECT COLUMN_NAME 
FROM 
INFORMATION_SCHEMA.COLUMNS 
WHERE 
TABLE_NAME = 'vwGetData' 
ORDER BY 
ORDINAL_POSITION ASC; 
+0

+1 por golpearme con la misma sintaxis –

+0

Soy principiante en C#. ¿Cómo uso esta consulta en el bloque de código C#? –

+0

Quizás es mi versión de SQL Server (2008) pero ninguna de las otras soluciones propuestas realmente funciona, ni siquiera la respuesta aceptada. ¡Solo este, solo FYI –

2

Hay una good sample here:

using System.Data; 
using System.Data.OleDb; 

OleDbConnection cn = new OleDbConnection(); 
OleDbCommand cmd = new OleDbCommand(); 
DataTable schemaTable; 
OleDbDataReader myReader; 

//Open a connection to the SQL Server Northwind database. 
cn.ConnectionString = "Provider=SQLOLEDB;Data Source=server;User ID=login; 
         Password=password;Initial Catalog=Northwind"; 
cn.Open(); 

//Retrieve records from the Employees table into a DataReader. 
cmd.Connection = cn; 
cmd.CommandText = "SELECT * FROM Employees"; 
myReader = cmd.ExecuteReader(CommandBehavior.KeyInfo); 

//Retrieve column schema into a DataTable. 
schemaTable = myReader.GetSchemaTable(); 

//For each field in the table... 
foreach (DataRow myField in schemaTable.Rows){ 
    //For each property of the field... 
    foreach (DataColumn myProperty in schemaTable.Columns) { 
    //Display the field name and value. 
    Console.WriteLine(myProperty.ColumnName + " = " + myField[myProperty].ToString()); 
    } 
    Console.WriteLine(); 

    //Pause. 
    Console.ReadLine(); 
} 

//Always close the DataReader and connection. 
myReader.Close(); 
cn.Close(); 
+1

realmente podrían deshacerse de sus recursos en su código de muestra! –

+0

¿obtiene esto todos los datos (SELECCIONE * FROM Empleados) y luego devuelve la información de la columna? – Thakur

1

También puede cargar los datos en un DataTable, así:

DataTable dtTable = new DataTable(); 

using (SqlCommand command = new SqlCommand("SELECT * FROM Table", conn)) 
{ 
    SqlDataReader reader = command.ExecuteReader(); 
    dtTable.Load(reader); 
} 

y recuperar la columna en la primera fila, así:

var column = dtTable.Rows[0]["YourColumn"]; 

o bucle a través de todas las filas y haga referencia a la columna, de la siguiente manera:

foreach (var c in dtTable.AsEnumerable()) 
{ 
    var column = c["YourColumn"]; 
} 
5

La manera más fácil que encontré es esta.

using (SqlCommand command = new SqlCommand("SELECT * FROM vwGetData", conn)) 
{ 
    SqlDataReader reader = command.ExecuteReader(); 
    while (reader.Read()) 
    { 
     for (int i = 0; i < reader.FieldCount; i++) 
      Console.Writeline(reader.GetName(i)); 
    } 
} 

Esto imprimirá los nombres de columna para cada línea de resultado que tenga.

+0

Funcionó como un amuleto para mí en una situación donde casi todas las otras soluciones fallaron, ¡así que muchas gracias! – Rami

0

Obtengo todos los nombres de columna usando el siguiente método.

private static List<string> GetColumnNamesFromTableSchema(IDataReader reader) 
    { 
     var schemaTable = reader.GetSchemaTable(); 
     var columnNames = new List<string>(); 
     if (schemaTable != null) 
      columnNames.AddRange(from DataRow row in schemaTable.Rows select row["ColumnName"].ToString()); 
     return columnNames; 
    } 

versión de la aplicación de consola

filas en DataTable devuelto por GetSchemaTable contiene información sobre las columnas de las tablas y quiero onlu nombre de la columna.

using (SqlConnection connection = new SqlConnection("Connection String")) 
       { 
        SqlCommand command = new SqlCommand("select top 10 * from myschema.MyTable", connection); 
        connection.Open(); 
        SqlDataReader reader = command.ExecuteReaderAsync().Result; 
        DataTable schemaTable = reader.GetSchemaTable(); 
        foreach (DataRow row in schemaTable.Rows) 
        { 
         //Console.WriteLine(row["ColumnName"]); 
         foreach (DataColumn column in schemaTable.Columns) 
         {  
          Console.WriteLine(string.Format("{0} = {1}", column.ColumnName, row[column.ColumnName]));         

         } 
         Console.WriteLine(">>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<"); 
        } 
} 

https://support.microsoft.com/en-us/kb/310107

+0

¿Podría elaborar más? Que esta pasando aqui –

0

consulta en MySQL

SELECT * FROM vwGetData LIMIT 0 

en sqlserver

SELECT TOP 0 * FROM vwGetData 

en el oráculo

SELECT * FROM vwGetData WHERE ROWNUM <=0 

continuación, ejecutar la consulta de C# por ejemplo 'oráculo'

OracleDataAdapter adapter = new OracleDataAdapter(query, connection); 
System.Data.DataTable result = new System.Data.DataTable(); 
adapter.Fill(result); 

List<string> columns = new List<string>(); 
foreach(DataColumn item in result.Columns) 
{ 
    columns.Add(item.ColumnName); 
} 
return columns; 
0

se puede obtener toda la lista de la columna

1.In sql editor de consulta escribir sólo el nombre de la tabla

2.select nombre de la tabla y presione Alt + F1

Cuestiones relacionadas