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';