Condividi tramite


Metadati (Sqlite)

Esistono due API per il recupero dei metadati in ADO.NET. Uno recupera i metadati relativi ai risultati della query. L'altro recupera i metadati sullo schema del database.

Metadati dei risultati della query

È possibile recuperare i metadati relativi ai risultati di una query usando il GetSchemaTable metodo in SqliteDataReader. L'oggetto restituito DataTable contiene le colonne seguenti:

colonna TIPO Descrizione
AllowDBNull Booleano Vero se la colonna di origine può essere NULL.
BaseCatalogName Stringa Nome del database della colonna di origine. Sempre NULL per le espressioni.
BaseColumnName Stringa Nome senza alias della colonna di origine. Sempre NULL per le espressioni.
BaseSchemaName Stringa Sempre NULL. SQLite non supporta gli schemi.
BaseServerName Stringa Percorso del file di database specificato nella stringa di connessione.
BaseTableName Stringa Nome della tabella della colonna di origine. Sempre NULL per le espressioni.
ColumnName Stringa Nome o alias della colonna nel set di risultati.
ColumnOrdinal Int32 L'ordinale della colonna nel set di risultati.
ColumnSize Int32 Sempre -1. Questa modifica può cambiare nelle versioni future di Microsoft.Data.Sqlite.
DataType TIPO Tipo di dati .NET predefinito della colonna.
DataTypeName Stringa Tipo di dati SQLite della colonna.
IsAliased Booleano Vero se il nome della colonna viene usato come alias nel set di risultati.
IsAutoIncrement Booleano True se la colonna di origine è stata creata con la parola chiave AUTOINCREMENT.
IsExpression Booleano Vero se la colonna origina da un'espressione nella query.
IsKey Booleano Vero se la colonna di origine fa parte della chiave primaria.
IsUnique Booleano Vero se la colonna di origine è unica.
NumericPrecision Int16 Sempre NULL. Questa modifica può cambiare nelle versioni future di Microsoft.Data.Sqlite.
NumericScale Int16 Sempre NULL. Questa modifica può cambiare nelle versioni future di Microsoft.Data.Sqlite.

Nell'esempio seguente viene illustrato come usare GetSchemaTable per creare una stringa di debug che mostra i metadati relativi a un risultato:

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();

Ad esempio, questa query genera la stringa di debug seguente:

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

Metadati dello schema

Microsoft.Data.Sqlite non implementa il metodo GetSchema in DbConnection. È invece possibile eseguire query direttamente per ottenere informazioni sullo schema usando le istruzioni PRAGMA e tabella sqlite_master , ad esempio table_info e foreign_key_list.

Ad esempio, questa query recupererà i metadati relativi a tutte le colonne del database.

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

Vedere anche