Lectura del esquema con System.Data.SqlClient.
Como he comentado antes, SqlClient no dispone de métodos nativos para acceder al esquema de la base de datos, dispone es su defecto de vistas del propio SQL Server para realizar estas acciones.
SELECT * FROM Information_Schema.Tables where Table_Type = 'BASE TABLE'"
BASE TABLE nos indica que estamos buscando las tablas de la base de datos, también podríamos indicar VIEWS y la sentencia devolvería el listado de vistas.Para obtener el listado de columnas de una tabla utilizaremos la siguiente sentencia SQL:
SELECT COLUMN_NAME, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH FROM Information_Schema.Columns WHERE TABLE_NAME = "jobs”
En este caso nos devuelve la información correspondiente a la tabla jobs de la base de datos PUBS.El código siguiente muestra como ejecutar desde c# las dos sentencias anteriores:
public static DataSet LoadTableSchemaInfo(string db) {
DataSet ds = new DataSet();
string TABLES_SCHEMA = "SELECT Table_Schema, table_name FROM Information_Schema.Tables where Table_Type = 'BASE TABLE'"
Connection(db);
SqlCommand sqlComd = new SqlCommand(TABLES_SCHEMA, _connection);
SqlDataAdapter dataAdatpter = new SqlDataAdapter(sqlComd);
dataAdatpter.Fill(ds);
_connection.Close();
return(ds);
}
//
public static DataSet LoadColumnSchemaInfo(string db, string column) {
DataSet ds = new DataSet();
string COLUMNS_SCHEMA = "SELECT COLUMN_NAME, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH FROM Information_Schema.Columns WHERE TABLE_NAME = ";
Connection(db);
SqlCommand sqlComd = new SqlCommand(COLUMNS_SCHEMA + "'" + column + "'", _connection);
SqlDataAdapter dataAdatpter = new SqlDataAdapter(sqlComd);
dataAdatpter.Fill(ds);
_connection.Close();
return(ds);
}
Sobre estas vistas de sistema para leer el esquema de una base de datos encontrareis amplia información en los Books Online de SQL Server.
Lectura del esquema con System.Data.OleDb
Con OleDb la forma de leer el esquema cambia bastante debido a que OleDb incorpora funciones nativas para leerlo. A través del método GetOleDbSchemaTable podremos leer el esquema de una base de datos o de una tabla.
Este método nos devolverá un DataTable con la información de las tablas o columnas:
DataTable dtSchema = _connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] {null, null, null, "TABLE"});
DataTable dtColumns = _connection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[] {null, null, column, null});
En el ejemplo, c#, que acompaña al articulo encontrareis dos clases que muestran los dos métodos de acceso al esquema de una base de datos de SQL Server.Enlaces relacionadas:
Código de ejemplo en c#
Información sobre Schema Information en los Books Online de SQL Server
Saludos
Alex