Compartilhar via


Metadados (Sqlite)

Há duas APIs para recuperar metadados em ADO.NET. Uma recupera metadados sobre resultados de consultas. A outra recupera metadados sobre o esquema de banco de dados.

Metadados de resultado de consulta

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

Coluna Type Descrição
AllowDBNull Boolean 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 alias da coluna de origem. Sempre NULL para expressões.
BaseSchemaName String Sempre NULL. O SQLite não dá suporte a 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 Tipo O tipo de dados do .NET padrão da coluna.
DataTypeName String O tipo de dados do SQLite da coluna.
IsAliased Booliano True se o nome da coluna for com alias no conjunto de resultados.
IsAutoIncrement Booliano True se a coluna de origem foi criada com a palavra-chave AUTOINCREMENT.
IsExpression Booliano True se a coluna se origina de uma expressão na consulta.
IsKey Booliano True se a coluna de origem fizer parte da PRIMARY KEY.
IsUnique Booliano 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 de esquema

O Microsoft.Data.Sqlite não implementa o método GetSchema no 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';

Confira também