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