Cómo recuperar información del esquema mediante GetOleDbSchemaTable y Visual Basic .NET

Para una versión de Microsoft Visual C# .NET de este artículo, consulte
309681 .
Para obtener una versión de Microsoft Visual Basic 6.0 de este artículo, consulte
186246 .

Este artículo hace referencia al siguiente espacio de nombres de biblioteca de clases de Microsoft.NET Framework:
  • System.Data.OleDb

EN ESTA TAREA

Resumen

En este artículo se muestra cómo utilizar el método GetOleDbSchemaTable del objeto OleDbConnection de ADO.NET para recuperar información de esquema de base de datos. Información de esquema en un origen de datos incluye las bases de datos o catálogos que están disponibles desde el origen de datos, tablas y vistas en una base de datos, así como las restricciones que existen y así sucesivamente. Información de esquema de una tabla incluye las claves principales, columnas y campos Autonuméricos.

Tenga en cuenta que ningún método equivale a GetOleDbSchemaTable cuando se usa un objeto SqlClient.SqlConnection . El proveedor de datos .NET de SQL Server expone información de esquema de back-end a través de procedimientos almacenados y vistas informativas. Para obtener más información acerca de las vistas y procedimientos almacenados que están disponibles a través de Microsoft SQL Server, vea la referencia de Transact-SQL en MSDN Library.

Requisitos

La lista siguiente describe el hardware, software, infraestructura de red y service packs recomendados que necesita:
  • Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server o Windows NT 4.0 Server
  • Microsoft Visual Studio .NET
En este artículo se supone que está familiarizado con los temas siguientes:
  • Visual Studio .NET
  • Fundamentos ADO.NET y sintaxis

Método GetOleDbSchemaTable del objeto OleDbConnection

El proveedor de datos OLE DB .NET usa el método GetOleDbSchemaTable del objeto OleDbConnection para exponer información de esquema. GetOleDbSchemaTable devuelve una DataTable que se rellena con la información de esquema.

El primer argumento de GetOleDbSchemaTable es el parámetro de esquema, un argumento OleDbSchemaGuid que identifica la información de esquema que se va a devolver (como tablas, columnas y claves principales). El segundo argumento es una matriz de objetos de restricciones para filtrar las filas que se devuelven en el esquema de DataTable (por ejemplo, puede especificar restricciones de tabla nombre, tipo, propietario y esquema).

Miembros de OleDbSchemaGuid

El argumento OleDbSchemaGuid especifica el tipo de tabla de esquema para el método GetOleDbSchemaTable . Algunos de los miembros de OleDbSchemaGuid incluyen lo siguiente:
  • Columnas
  • Claves externas
  • Índices
  • Claves principales
  • Tablas
  • Vistas
Para obtener una lista completa de los miembros de OleDbSchemaGuid , consulte el sitio Web "Miembros de OleDbSchemaGuid" en la
Sección de referencias .

Restricciones

Las restricciones son una matriz de objetos de valores de filtro, cada uno de los cuales corresponde a un objeto DataColumn en DataTableresultante. El argumento OleDbSchemaGuid determina las restricciones importantes. Por ejemplo, cuando especifica un OleDbSchemaGuid de tablas, la matriz de restricciones es:
{TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE}
Para revisar las restricciones disponibles, haga clic en cualquiera de los miembros de OleDbSchemaGuid en el siguiente sitio Web de Microsoft:Cuando pase valores en la matriz de restricciones, incluya la palabra clave de Visual Basic .NET nada para los elementos de matriz que no contengan valores. Por ejemplo, si desea recuperar esquemas de tabla, use OleDbSchemaGuid.Tables. Sin embargo, si especifica tablas, esto también devuelve alias, sinónimos, vistas y otros objetos relacionados. Por lo tanto, si desea filtrar todos los objetos excepto las tablas, use una restricción de TABLE para TABLE_TYPE. Puede usar Nothing para TABLE_CATALOG, TABLE_SCHEMA y TABLE_NAME porque no está filtrando estos objetos:
 MySchemaTable = MyConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, _                   New Object() {Nothing, Nothing, Nothing, "TABLE"})

DataTable devuelto

La tabla de datos que devuelve el método GetOleDbSchemaTable tiene una fila para cada objeto que cumple con los criterios de restricción y el tipo de OleDbSchemaGuid . DataTable contiene una columna para cada una de las columnas de restricción, que va seguida de información de esquema adicional basada en el campo OleDbSchemaGuid .

Por ejemplo, cuando se utilice el código siguiente, cada fila de DataTable devuelto es una tabla de base de datos:
MySchemaTable = MyConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, _                   New Object() {Nothing, Nothing, Nothing, "TABLE"})

Las columnas que se devuelven en la DataTable son las columnas de restricción (TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE), que van seguidas de las columnas de esquema adicionales de TABLE_GUID, descripción, TABLE_PROPID, DATE_CREATED y DATE_MODIFIED.

Para obtener esta lista de nombres de columna (es decir, los descriptores de campo, como TABLE_CATALOG, TABLE_SCHEMA y TABLE_NAME), puede usar la posición ordinal de las columnas. Tenga en cuenta que la matriz de columnas está basada en cero:
For i = 0 To schemaTable.Columns.Count - 1   Console.WriteLine(schemaTable.Columns(i).ToString)
Next i

Para obtener los valores de cada columna (es decir, los nombres de tabla reales, como categorías, clientes y empleados), puede utilizar el nombre del elemento en la
DataRow. Tenga en cuenta que las filas están basadas en cero:
For i = 0 To schemaTable.Rows.Count - 1   Console.WriteLine(schemaTable.Rows(i)!TABLE_NAME.ToString)
Next i

También puede usar la posición ordinal del elemento en la fila para obtener los valores. Tenga en cuenta que la matriz de elemento también está basada en cero:
For i = 0 To schemaTable.Rows.Count - 1   Console.WriteLine(schemaTable.Rows(i).Item(2).ToString)
Next i

Crear un ejemplo que enumere las tablas de una base de datos

El ejemplo siguiente enumera las tablas de la base de datos Northwind de SQL Server.

OleDbSchemaGuid.Tables devuelve estas tablas (incluidas las vistas) que son accesibles para un registro dado. Si especifica una matriz de objeto de {Nothing, Nothing, Nothing, "TABLE"}, filtra para incluir únicamente un TABLE_TYPE de TABLE. A continuación, incluya el nombre de tabla (TABLE_NAME) de cada fila de la tabla de esquema devuelta.
  1. Inicie Visual Studio. NET.
  2. Cree un nuevo proyecto de aplicación de consola de Visual Basic. Module1.vb se agrega al proyecto de forma predeterminada.
  3. Abra la ventana código de Module1. Pegue el código siguiente en la parte superior de la ventana código, encima de la declaración de módulo :
       Imports System.Data   Imports System.Data.OleDb

  4. En la ventana código, pegue el código siguiente en el procedimiento Sub Main .

    Nota: Debe cambiar el identificador de usuario < username > y contraseña = < contraseña segura > a los valores correctos antes de ejecutar este código. Asegúrese de que el identificador de usuario tiene los permisos apropiados para realizar esta operación en la base de datos.
            Dim cn As New OleDbConnection()        Dim schemaTable As DataTable
    Dim i As Integer

    'Connect to the Northwind database in SQL Server.
    'Be sure to use an account that has permission to list tables.
    cn.ConnectionString = "Provider=SQLOLEDB;Data Source=server;User ID=<username>;Password=<strong password>;Initial Catalog=Northwind"
    cn.Open()

    'Retrieve schema information about tables.
    'Because tables include tables, views, and other objects,
    'restrict to just TABLE in the Object array of restrictions.
    schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, _
    New Object() {Nothing, Nothing, Nothing, "TABLE"})

    'List the table name from each row in the schema table.
    For i = 0 To schemaTable.Rows.Count - 1
    Console.WriteLine(schemaTable.Rows(i)!TABLE_NAME.ToString)
    Next i

    'Explicitly close - don't wait on garbage collection.
    cn.Close()

    'Pause
    Console.ReadLine()

  5. Modifique la ConnectionString para conectarse al equipo SQL Server con una cuenta que tenga permisos para enumerar tablas de la base de datos Northwind.
  6. Presione la tecla F5 para compilar y ejecutar el proyecto. Observe que las tablas se muestran en la ventana de consola.
  7. Presione ENTRAR para finalizar la aplicación consola y volver al entorno de desarrollo integrado (IDE).

Crear un ejemplo que recupere el esquema de una tabla

El ejemplo siguiente enumera información de esquema de la tabla Employees de la base de datos Northwind de SQL Server.

OleDbSchemaGuid.Tables devuelve estas tablas (incluidas las vistas) que son accesibles para un registro dado. Si especifica una matriz de objeto de {Nothing, Nothing, "Empleados", "TABLE"}, filtra para incluir únicamente una tabla denominada a Employees. A continuación, incluya la información de esquema para la tabla de esquema devuelta.
  1. Cree un nuevo proyecto de aplicación de consola de Visual Basic. Module1.vb se agrega al proyecto de forma predeterminada.
  2. Abra la ventana código de Module1. Pegue el código siguiente en la parte superior de la ventana código, encima de la declaración de módulo :
       Imports System.Data   Imports System.Data.OleDb

  3. En la ventana código, pegue el código siguiente en el procedimiento Sub Main .

    Nota: Debe cambiar el identificador de usuario < username > y contraseña = < contraseña segura > a los valores correctos antes de ejecutar este código. Asegúrese de que el identificador de usuario tiene los permisos apropiados para realizar esta operación en la base de datos.
            Dim cn As New OleDbConnection()        Dim schemaTable As DataTable
    Dim i As Integer

    'Connect to the Northwind database in SQL Server.
    'Be sure to use an account that has permission to list tables.
    cn.ConnectionString = "Provider=SQLOLEDB;Data Source=server;User ID=<username>;Password=<strong password>;Initial Catalog=Northwind"
    cn.Open()

    'Retrieve schema information about the Employees table.
    schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, _
    New Object() {Nothing, Nothing, "Employees", "TABLE"})

    'List the schema info for the Employees table
    'in the format Field Descriptor : Field Value.
    For i = 0 To schemaTable.Columns.Count - 1
    Console.WriteLine(schemaTable.Columns(i).ToString & " : " & _
    schemaTable.Rows(0).Item(i).ToString)
    Next i

    'Explicitly close - don't wait on garbage collection.
    cn.Close()

    'Pause
    Console.ReadLine()

  4. Modifique la ConnectionString para conectarse al equipo SQL Server con una cuenta que tenga permisos para recuperar el esquema de la tabla empleados.
  5. Presione F5 para compilar y ejecutar el proyecto. Observe que la información de esquema aparece en la ventana de la consola.
  6. Presione ENTRAR para finalizar la aplicación consola y volver al IDE.

Crear un ejemplo que enumere las columnas de una tabla

El ejemplo siguiente enumera los nombres de las columnas de la tabla Employees de la base de datos Northwind de SQL Server.

OleDbSchemaGuid.Columns devuelve estas columnas en tablas y vistas que son accesibles para un registro dado. Si especifica una matriz de objeto de {Nothing, Nothing, "Empleados", Nothing}, aplique un filtro para incluir sólo las columnas de la tabla Employees.
  1. Cree un nuevo proyecto de aplicación de consola de Visual Basic. Module1.vb se agrega al proyecto de forma predeterminada.
  2. Abra la ventana código de Module1. Pegue el código siguiente en la parte superior de la ventana código, encima de la declaración de módulo :
       Imports System.Data   Imports System.Data.OleDb

  3. En la ventana código, pegue el código siguiente en el procedimiento Sub Main .

    Nota: Debe cambiar el identificador de usuario < username > y contraseña = < contraseña segura > a los valores correctos antes de ejecutar este código. Asegúrese de que el identificador de usuario tiene los permisos apropiados para realizar esta operación en la base de datos.
            Dim cn As New OleDbConnection()        Dim schemaTable As DataTable
    Dim i As Integer

    'Connect to the Northwind database in SQL Server.
    'Be sure to use an account that has permission
    'to list the columns in the Employees table.
    cn.ConnectionString = "Provider=SQLOLEDB;Data Source=server;User ID=<username>;Password=<strong password>;Initial Catalog=Northwind"
    cn.Open()

    'Retrieve schema information about columns.
    'Restrict to just the Employees TABLE.
    schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, _
    New Object() {Nothing, Nothing, "Employees", Nothing})

    'List the column name from each row in the schema table.
    For i = 0 To schemaTable.Rows.Count - 1
    Console.WriteLine(schemaTable.Rows(i)!COLUMN_NAME.ToString)
    Next i

    'Explicitly close - don't wait on garbage collection.
    cn.Close()

    'Pause
    Console.ReadLine()

  4. Modifique la ConnectionString para conectarse al equipo SQL Server con una cuenta que tenga permisos para enumerar columnas de la tabla Employees.
  5. Presione F5 para compilar y ejecutar el proyecto. Observe que las columnas de la tabla Employees se muestran en la ventana de consola.
  6. Presione ENTRAR para finalizar la aplicación consola y volver al IDE.

Crear un ejemplo que muestre las claves principales en una tabla

El ejemplo siguiente enumera las claves principales de la tabla Employees de la base de datos Northwind de SQL Server y de la tabla Employee de la base de datos Pubs de SQL Server.

OleDbSchemaGuid.Primary_Keys devuelve estas claves principales en un catálogo que son accesibles para un registro dado. En este ejemplo, OleDbConnection es para SQL Server pero no para una base de datos de SQL Server específica:
cn.ConnectionString = "Provider=SQLOLEDB;Data Source=server;User ID=<username>;Password=<strong password>;"
En su lugar, este código especifica las bases de datos Neptuno o Pubs como TABLE_CATALOG en la matriz de restricciones. Este código especifica el propietario de la tabla, "dbo", para la restricción TABLE_SCHEMA. Además, este código especifica los nombres de tabla para la restricción TABLE_NAME.

Para obtener la clave principal de la tabla Employees de la base de datos Northwind, utilice una matriz de objeto de {"Neptuno", "dbo", "Empleados"}:
schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Primary_Keys, _              New Object() {"Northwind", "dbo", "Employees"})

Para obtener la clave principal de la tabla Employee de la base de datos Pubs, utilice una matriz de objeto de {"Pubs", "dbo", "Empleado"}:
schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Primary_Keys, _              New Object() {"Pubs", "dbo", "Employee"})

Para crear el ejemplo, siga estos pasos:
  1. Cree un nuevo proyecto de aplicación de consola de Visual Basic. Module1.vb se agrega al proyecto de forma predeterminada.
  2. Abra la ventana código de Module1. Pegue el código siguiente en la parte superior de la ventana código, encima de la declaración de módulo :
       Imports System.Data   Imports System.Data.OleDb

  3. En la ventana código, pegue el código siguiente en el procedimiento Sub Main .

    Nota: Debe cambiar el identificador de usuario < username > y contraseña = < contraseña segura > a los valores correctos antes de ejecutar este código. Asegúrese de que el identificador de usuario tiene los permisos apropiados para realizar esta operación en la base de datos.
            Dim cn As New OleDbConnection()        Dim schemaTable As DataTable

    'Connect to SQL Server.
    'Be sure to use an account that has permissions to list primary keys
    'in both the Northwind and Pubs databases.
    cn.ConnectionString = "Provider=SQLOLEDB;Data Source=server;User ID=<username>;Password=<strong password>;"
    cn.Open()

    'Retrieve schema information about primary keys.
    'Restrict to just the Employees TABLE in the Northwind CATALOG.
    schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Primary_Keys, _
    New Object() {"Northwind", "dbo", "Employees"})

    'List the primary key for the first row in the schema table.
    'The first three Items (zero-based) in the row are catalog, schema, and table.
    'The fourth item is the primary key.
    Console.WriteLine(schemaTable.Rows(0).Item(3).ToString)

    'Retrieve primary key for the Employee TABLE in the Pubs CATALOG.
    schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Primary_Keys, _
    New Object() {"Pubs", "dbo", "Employee"})

    'List the primary key for the first row in the schema table.
    Console.WriteLine(schemaTable.Rows(0).Item(3).ToString)

    'Explicitly close - don't wait on garbage collection.
    cn.Close()

    'Pause
    Console.ReadLine()

  4. Modifique la ConnectionString para conectarse al equipo SQL Server con una cuenta que tenga permisos suficientes para enumerar las claves principales.
  5. Presione F5 para compilar y ejecutar el proyecto. Observe que las claves principales de la tabla Employees de la base de datos Northwind y la tabla Employee de la base de datos Pubs aparecen en la ventana de la consola.
  6. Presione ENTRAR para finalizar la aplicación consola y volver al IDE.

Referencias

Para obtener una lista completa de los miembros de OleDbSchemaGuid , consulte el tema siguiente en la documentación del Kit de desarrollo de Software (SDK) de Microsoft.NET Framework. Para obtener una lista de restricciones disponibles, haga clic en cualquiera de los miembros de OleDbSchemaGuid :Para obtener más información, consulte los temas siguientes en la documentación del SDK de.NET Framework:
Propiedades

Id. de artículo: 309488 - Última revisión: 22 ene. 2017 - Revisión: 2

Comentarios