Condividi tramite


Metadati (Sqlite)

Esistono due API per il recupero dei metadati in ADO.NET. Uno recupera i metadati relativi ai risultati delle 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 metodo GetSchemaTable in SqliteDataReader. L'oggetto DataTable restituito contiene le seguenti colonne:

Column Type Descrizione
AllowDBNull Boolean True se la colonna di origine può essere NULL.
BaseCatalogName String Nome del database della colonna di origine. Sempre NULL per le espressioni.
BaseColumnName String Nome non allineato della colonna di origine. Sempre NULL per le espressioni.
BaseSchemaName String Sempre NULL. SQLite non supporta gli schemi.
BaseServerName String Percorso del file di database specificato nella stringa di connessione.
BaseTableName String Nome della tabella della colonna di origine. Sempre NULL per le espressioni.
ColumnName String Nome o alias della colonna nel set di risultati.
ColumnOrdinal Int32 Ordinale della colonna nel set di risultati.
ColumnSize Int32 Sempre -1. Questa modifica può essere modificata nelle versioni future di Microsoft.Data.Sqlite.
DataType Type Tipo di dati .NET predefinito della colonna.
DataTypeName String Tipo di dati SQLite della colonna.
IsAliased Booleano True se il nome della colonna è alias nel set di risultati.
IsAutoIncrement Booleano True se la colonna di origine è stata creata con la parola chiave AUTOINCREMENT.
IsExpression Booleano True se la colonna ha origine da un'espressione nella query.
IsKey Booleano True se la colonna di origine fa parte della CHIAVE PRIMARIA.
IsUnique Booleano True se la colonna di origine è UNIQUE.
NumericPrecision Int16 Sempre NULL. Questa modifica può essere modificata nelle versioni future di Microsoft.Data.Sqlite.
NumericScale Int16 Sempre NULL. Questa modifica può essere modificata 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 la 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';

Vedi anche