2011-08-23 17 views
13

ho un vwGetData vista che prende i dati da due tabelle T1, T2 e ha campi:ottenere i nomi di colonna da una query senza dati

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

fornirò qui sotto ingresso

Select * from vwGetData 

voglio per arrivare sotto output in C#/SQL

ALIAS1 
Field2 
Field3 
Field4 
ALIAS5 

o

012.351.641,061 mila

Voglio farlo utilizzando C# e SQL.

+0

Come si correlano le due tabelle? – Curt

+3

forse aggiungi "dove 1 = 0" e ispezioni le colonne restituite? –

+0

inserisci il codice che hai scritto finora? E quale sembra essere il problema? – Waqas

risposta

25

La prima cosa che si dovrebbe fare è assicurarsi che nessun dato viene restituito:

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

Ora patto di saper come impostare un DataReader si dovrebbe fare quanto segue:

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"]); 
    } 
} 

Si può anche guardare allo SQL Catalog SYS Views.

+0

questo è quello che mi serviva TOP 0 lo fa :) – Thakur

+0

potresti anche usare SELECT TOP 0 [vwGetData]. * FROM [vwGetData] WHERE 1 = 2; –

+0

Buona idea @MarkKram grazie! –

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

+1 per picchiarmi con esattamente la stessa sintassi –

+0

Sono principiante in C#. Come posso usare questa query nel blocco di codice C#? –

+0

Forse è la mia versione di SQL Server (2008) ma nessuna delle altre soluzioni proposte funziona davvero, nemmeno la risposta accettata. Solo questo ha fatto, solo FYI –

2

C'è un 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

potevano davvero fare con lo smaltimento delle loro risorse nel loro codice di esempio! –

+0

ottiene tutti i dati (SELECT * FROM Employees) e restituisce le informazioni sulla colonna? – Thakur

1

È anche possibile caricare i dati in un DataTable, in questo modo:

DataTable dtTable = new DataTable(); 

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

e recuperare la colonna in prima fila, in questo modo:

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

O ciclo attraverso tutte le righe e fare riferimento alla colonna, in questo modo:

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

Il modo più semplice che ho trovato è questo.

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)); 
    } 
} 

In questo modo verranno stampati i nomi delle colonne per ciascuna riga di risultato.

+0

Ha funzionato come un incantesimo per me in una situazione in cui praticamente tutte le altre soluzioni sono fallite, quindi grazie mille! – Rami

0

Ricevo tutti i nomi delle colonne utilizzando il seguente metodo.

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; 
    } 

versione console Applicazione

Righe in DataTable restituito da GetSchemaTable contiene le informazioni sulle colonne della tabella e voglio nome della colonna onlu.

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

Potresti elaborare di più? Che cosa sta succedendo qui –

0

interrogazione in mysql

SELECT * FROM vwGetData LIMIT 0 

in sqlserver

SELECT TOP 0 * FROM vwGetData 

nell'oracolo

SELECT * FROM vwGetData WHERE ROWNUM <=0 

quindi eseguire query da C# ad esempio 'oracolo'

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

è possibile ottenere tutte elenco di colonne

1.In editor di query SQL scrivere solo il nome della tabella

2.select nome della tabella e premere Alt + F1

Problemi correlati