C# - Tetszőleges SQL adattábla sémájának lekérdezése

forráskód letöltése
Ha adott egy adattábla, de szükségünk lenne programból elérnünk e táblának az oszlopait úgy, hogy meghatározhassuk a neveit, típusait, egyéb információit, akkor ehhez le kell kérdeznünk a tábla sémáját. Ezt a sémát is egy adattáblaként kapjuk meg, melyet felhasználva kiolvashatunk bármilyen, számunkra szükséges információt az adattábla tulajdonságairól.
A mellékelt példa futtatása előtt a Form1.cs forráskód 113. sorában lévő connStr változót módosítsa annak megfelelően, hogy elérhető legyen az MS SQL Northwind példaadatbázisa.
A séma lekérdezéséhez az SqlDataReader osztály GetSchemaTable függvénye lesz a megoldás. Ez a függvény az aktuális tábláról ad vissza séma információt úgy, hogy azokat egy DataTable osztályban kapjuk meg.
Készítünk egy függvényt, mely egy tetszőleges adatbázis tetszőleges táblájáról lekérdezi a sémát. A függvény első paramétereként egy SqlConnection osztályt kell átadni, mely leírja a kapcsolatot a szükséges adatbázissal. Második paraméterként annak a táblának a nevét kell megadni sztringként, melyről az információt szeretnénk lekérni.
    private DataTable GetSchemaTable(SqlConnection connection, string tableName)
    {
A függvényben létrehozunk egy SqlCommand osztályt, melyben megfogalmazunk egy olyan select utasítást, ahol a kívánt tábla összes oszlopa szerepel. Ezt felhasználva az ExecuteReader függvényt meghívva létrehozhatunk egy SqlDataReader osztályt, melynek ezek után már hívható a GetSchemaTable függvénye.
      SqlCommand c = new SqlCommand("select top 1 * from "+tableName, connection);
      SqlDataReader dr = c.ExecuteReader();                       
      return dr.GetSchemaTable();
    }
A függvény felhasználása egyszerű: létrehozunk egy SQL kapcsolatot és egy DataSet osztályt, annak érdekében, hogy a kapott DataTable, mely a sémát tartalmazza, tárolható legyen.
    private void button1_Click(object sender, System.EventArgs e)
    {
      SqlConnection connection = new SqlConnection(connStr);
      connection.Open();
      DataSet ds = new DataSet();
      ds.Tables.Add(GetSchemaTable(connection, "Orders"));      
Ezek után már csak a felhasználás marad, mely nyilván az adott feladatunktól függ. Most csak annyit teszünk, hogy egy DataGrid-ben megjelenítjük a kapott eredményt.
      dataGrid1.DataSource = ds.Tables[0].DefaultView;        
    }