Partilhar via


Metadados (Sqlite)

Há duas APIs para recuperar metadados no ADO.NET. Um recupera metadados sobre os resultados da consulta. O outro recupera metadados sobre o esquema de banco de dados.

Metadados do resultado da consulta

Você pode recuperar metadados sobre os resultados de uma consulta usando o GetSchemaTable método em SqliteDataReader. O retornado DataTable contém as seguintes colunas:

Column Tipo Descrição
AllowDBNull Booleano True se a coluna de origem pode ser NULL.
BaseCatalogName String O nome do banco de dados da coluna de origem. Sempre NULL para expressões.
BaseColumnName String O nome sem aliased da coluna de origem. Sempre NULL para expressões.
BaseSchemaName String Sempre NULL. SQLite não suporta esquemas.
BaseServerName String O caminho para o arquivo de banco de dados especificado na cadeia de conexão.
BaseTableName String O nome da tabela da coluna de origem. Sempre NULL para expressões.
ColumnName String O nome ou alias da coluna no conjunto de resultados.
ColumnOrdinal Int32 O ordinal da coluna no conjunto de resultados.
ColumnSize Int32 Sempre -1. Isso pode mudar em versões futuras do Microsoft.Data.Sqlite.
DataType Type O tipo de dados .NET padrão da coluna.
DataTypeName String O tipo de dados SQLite da coluna.
IsAliased Boolean True se o nome da coluna for aliased no conjunto de resultados.
IsAutoIncrement Boolean True se a coluna de origem foi criada com a palavra-chave AUTOINCREMENT.
IsExpression Boolean True se a coluna for originada de uma expressão na consulta.
IsKey Boolean True se a coluna de origem fizer parte da CHAVE PRIMÁRIA.
IsUnique Boolean True se a coluna de origem for UNIQUE.
NumericPrecision Int16 Sempre NULL. Isso pode mudar em versões futuras do Microsoft.Data.Sqlite.
NumericScale Int16 Sempre NULL. Isso pode mudar em versões futuras do Microsoft.Data.Sqlite.

O exemplo a seguir mostra como usar GetSchemaTable para criar uma cadeia de caracteres de depuração que mostra metadados sobre um 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 exemplo, essa consulta produziria a seguinte cadeia de caracteres de depuração:

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

Metadados do esquema

Microsoft.Data.Sqlite não implementa o método GetSchema em DbConnection. Em vez disso, você pode consultar diretamente informações de esquema usando a tabela sqlite_master e instruções PRAGMA, como table_info e foreign_key_list.

Por exemplo, essa consulta recuperará metadados sobre todas as colunas no banco de dados.

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

Consulte também