Cum pot obține o listă de câmpuri returnate de un OdbcDataReader? (Programare, C#, Odbc)

Maxim a intrebat.

Cum pot obține o listă de câmpuri de la OdbcDataReader în C#?

De exemplu, pentru un tabel cu două câmpuri, Field1 și Field2:

DbCommand.CommandText = "SELECT * FROM TABLE WHERE 0=1";
DbReader = DbCommand.ExecuteReader();

DbReader.??? mi-ar da o listă cu două elemente – ["Field1","Field2"]

Există o astfel de funcție?

4 răspunsuri
Simon Wilson

Cred că știu ce este posibil să căutați. Dacă întrebați „Indiferent de textul interogării, puteți lista numele câmpurilor din setul de date returnat fără a lovi db pentru o verificare a schemei?”, atunci acest lucru ar trebui să funcționeze pentru dvs:

var db = new System.Data.Odbc.OdbcConnection ( @"MyODBCSqlConnectionString" );
db.Open();

var cmd = db.CreateCommand();
cmd.CommandText = "SELECT * from MyTable";
var reader = cmd.ExecuteReader();

for( int ordinal = 0; ordinal< reader.FieldCount; ordinal++)
    Console.WriteLine( "Field {0}: {1}", ordinal, reader.GetName( ordinal ) );

Jeff Sternal

Puteți utiliza OdbcDataReader.GetSchemaTable pentru a obține informații despre coloanele pentru setul de rezultate curent (cred – documentația nu este clară cu privire la faptul că acceptă sau nu seturi de rezultate multiple). Ar trebui să citiți documentația legată dacă intenționați să vă bazați pe această metodă.

În special, rețineți următoarele:

Furnizorul de date .NET Framework pentru ODBC presupune că informațiile privind metadatele sunt disponibile de la un driver ODBC după ce este apelată una dintre funcțiile SQLPrepare, SQLExecute sau SQLExecuteDirect. Pentru ca comportamentul de comandă „SchemaOnly” să funcționeze corect, SQLPrepare trebuie să returneze informațiile necesare privind metadatele. Nu toate driverele ODBC acceptă această funcție sau returnează informații despre metadate.

Și aceasta:

Pentru a vă asigura că coloanele de metadate returnează informațiile corecte, trebuie să apelați ExecuteReader cu parametrul de comportament setat la KeyInfo. În caz contrar, unele dintre coloanele din tabelul de scheme pot returna date implicite, nule sau incorecte.

Mark Bell

Dacă am înțeles corect, doriți numele câmpurilor din tabel – acest lucru se poate face utilizând OleDbSchemaGuid class.

Iată un link util care vă ghidează în obținerea numelor de tabele și coloane.

Și un articol Microsoft mai detaliat despre „OleDbSchemaGuid”.

Vanderley Maia

Iată un exemplu care folosește ideea lui Simon Wilson. trebuie doar să cântărești: NomeServidor, NomeBD și NomeTabela la cazul tău.

using System.Data.SqlClient;

        private void button1_Click(object sender, EventArgs e)
    {

        OdbcConnection conn = new OdbcConnection();
        conn.ConnectionString =
        "Driver={SQL Server};" +
        "Server=NomeServidor;" +
        "DataBase=NomeBD;" +
        "Uid=;" +
        "Pwd=;";
        conn.Open();

        OdbcCommand DbCommand = conn.CreateCommand();
        DbCommand.CommandText = "SELECT * FROM NomeTabela";
        OdbcDataReader DbReader = DbCommand.ExecuteReader();

        for (int ordinal = 0; ordinal < DbReader.FieldCount; ordinal++)
            Console.WriteLine("Field {0}: {1}", ordinal, DbReader.GetName(ordinal));
    }

În cazul meu, rezultatul în consolă, a fost că:

Și acesta este tabelul meu văzut din SQL Server Management Studio Express:

Tags:,