Compartir a través de


Metadatos (Sqlite)

Existen dos API para recuperar metadatos en ADO.NET. Una recupera los metadatos sobre los resultados de consulta y la otra sobre el esquema de la base de datos.

Metadatos de resultados de consulta

Para recuperar metadatos sobre los resultados de una consulta, se usa el método GetSchemaTable en SqliteDataReader. El elemento DataTable devuelto contiene las siguientes columnas:

Columna Type Description
AllowDBNull Booleano True si la columna de origen puede ser NULL.
BaseCatalogName String Nombre de la base de datos de la columna de origen. Siempre es NULL en las expresiones.
BaseColumnName String Nombre sin alias de la columna de origen. Siempre es NULL en las expresiones.
BaseSchemaName String Siempre es NULL. SQLite no admite esquemas.
BaseServerName String Ruta de acceso al archivo de base de datos especificado en la cadena de conexión.
BaseTableName String Nombre de la tabla de la columna de origen. Siempre es NULL en las expresiones.
ColumnName String Nombre o alias de la columna en el conjunto de resultados.
ColumnOrdinal Int32 Número ordinal de la columna en el conjunto de resultados.
ColumnSize Int32 Siempre es -1. Esto puede cambiar en versiones futuras de Microsoft.Data.Sqlite.
DataType Tipo Tipo de datos predeterminado de .NET de la columna.
DataTypeName String Tipo de datos de SQLite de la columna.
IsAliased Booleano True si el nombre de columna tiene alias en el conjunto de resultados.
IsAutoIncrement Booleano True si la columna de origen se creó con la palabra clave AUTOINCREMENT.
IsExpression Booleano True si la columna se origina a partir de una expresión de la consulta.
IsKey Booleano True si la columna de origen forma parte de PRIMARY KEY.
IsUnique Booleano True si la columna de origen es UNIQUE.
NumericPrecision Int16 Siempre es NULL. Esto puede cambiar en versiones futuras de Microsoft.Data.Sqlite.
NumericScale Int16 Siempre es NULL. Esto puede cambiar en versiones futuras de Microsoft.Data.Sqlite.

En el siguiente ejemplo se muestra cómo usar GetSchemaTable para crear una cadena de depuración que muestre los metadatos de un resultado:

var builder = new StringBuilder();
var schemaTable = reader.GetSchemaTable();

foreach (DataRow column in schemaTable.Rows)
{
    if ((bool)column[SchemaTableColumn.IsExpression])
    {
        builder.Append("(expression)");
    }
    else
    {
        builder.Append(column[SchemaTableColumn.BaseTableName])
               .Append(".")
               .Append(column[SchemaTableColumn.BaseColumnName]);
    }

    builder.Append(" ");

    if ((bool)column[SchemaTableColumn.IsAliased])
        builder.Append("AS ")
               .Append(column[SchemaTableColumn.ColumnName])
               .Append(" ");

    builder.Append(column["DataTypeName"])
           .Append(" ");

    if (column[SchemaTableColumn.AllowDBNull] as bool? == false)
        builder.Append("NOT NULL ");

    if (column[SchemaTableColumn.IsKey] as bool? == true)
        builder.Append("PRIMARY KEY ");

    if (column[SchemaTableOptionalColumn.IsAutoIncrement] as bool? == true)
        builder.Append("AUTOINCREMENT ");

    if (column[SchemaTableColumn.IsUnique] as bool? == true)
        builder.Append("UNIQUE ");

    builder.AppendLine();
}

var debugString = builder.ToString();

Por ejemplo, esta consulta produciría la siguiente cadena de depuración:

SELECT id AS post_id,
       title,
       body,
       random() AS random
FROM post
post.id AS post_id INTEGER PRIMARY KEY AUTOINCREMENT
post.title TEXT NOT NULL UNIQUE
post.body TEXT
(expression) AS random BLOB

Metadatos de esquema

Microsoft.Data.Sqlite no implementa el método GetSchema en DbConnection. En su lugar, la información de esquema se puede consultar directamente usando la tabla sqlite_master, así como instrucciones PRAGMA como table_info y foreign_key_list.

Con esta consulta, por ejemplo, se recuperarán los metadatos de todas las columnas de la base de datos.

SELECT t.name AS tbl_name, c.name, c.type, c.notnull, c.dflt_value, c.pk
FROM sqlite_master AS t,
     pragma_table_info(t.name) AS c
WHERE t.type = 'table';

Vea también