Partager via


Métadonnées (Sqlite)

Il existe deux API pour récupérer les métadonnées dans ADO.NET. L’un récupère les métadonnées sur les résultats de la requête. L’autre récupère les métadonnées relatives au schéma de base de données.

Métadonnées de résultat de requête

Vous pouvez récupérer des métadonnées sur les résultats d’une requête à l’aide de la GetSchemaTable méthode sur SqliteDataReader. Le retour DataTable contient les colonnes suivantes :

Colonne Catégorie Descriptif
AllowDBNull Booléen True si la colonne d’origine peut être NULL.
BaseCatalogName Chaîne Nom de la base de données de la colonne d’origine. Toujours NULL pour les expressions.
BaseColumnName Chaîne Nom sans alias de la colonne d’origine. Toujours NULL pour les expressions.
BaseSchemaName Chaîne Toujours NULL. SQLite ne prend pas en charge les schémas.
BaseServerName Chaîne Chemin d’accès au fichier de base de données spécifié dans la chaîne de connexion.
BaseTableName Chaîne Nom de la table de la colonne d’origine. Toujours NULL pour les expressions.
ColumnName Chaîne Nom ou alias de la colonne dans le jeu de résultats.
ColumnOrdinal Int32 Ordinal de la colonne dans le jeu de résultats.
ColumnSize Int32 Toujours -1. Cela peut changer dans les futures versions de Microsoft.Data.Sqlite.
DataType Catégorie Type de données .NET par défaut de la colonne.
DataTypeName Chaîne Type de données SQLite de la colonne.
IsAliased Booléen True si le nom de colonne possède un alias dans le jeu de résultats.
IsAutoIncrement Booléen True si la colonne d’origine a été créée avec le mot clé AUTOINCREMENT.
IsExpression Booléen True si la colonne provient d’une expression dans la requête.
IsKey Booléen True si la colonne d’origine fait partie de la CLÉ PRIMAIRE.
IsUnique Booléen True si la colonne d’origine est UNIQUE.
NumericPrecision Int16 Toujours NULL. Cela peut changer dans les futures versions de Microsoft.Data.Sqlite.
NumericScale Int16 Toujours NULL. Cela peut changer dans les futures versions de Microsoft.Data.Sqlite.

L’exemple suivant montre comment créer GetSchemaTable une chaîne de débogage qui affiche les métadonnées relatives à un résultat :

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

Par exemple, cette requête produit la chaîne de débogage suivante :

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

Métadonnée schéma

Microsoft.Data.Sqlite n’implémente pas la méthode GetSchema sur DbConnection. Au lieu de cela, vous pouvez interroger directement des informations de schéma à l’aide de la table sqlite_master et des instructions PRAGMA comme table_info et foreign_key_list.

Par exemple, cette requête récupère les métadonnées sur toutes les colonnes de la base de données.

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

Voir aussi