Partager via


Métadonnées (Sqlite)

Il existe deux API pour récupérer des métadonnées dans ADO.NET. L’une récupère les métadonnées relatives aux 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 relatives aux résultats de la requête

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

Colonne Type Description
AllowDBNull Boolean True si la colonne d’origine peut être NULL.
BaseCatalogName String Le nom de la base de données de la colonne d’origine. Toujours NULL pour les expressions.
BaseColumnName String Le nom sans alias de la colonne d’origine. Toujours NULL pour les expressions.
BaseSchemaName String Toujours NULL. SQLite ne prend pas en charge les schémas.
BaseServerName String Le chemin d’accès au fichier de base de données spécifié dans la chaîne de connexion.
BaseTableName String Le nom du tableau de la colonne d’origine. Toujours NULL pour les expressions.
ColumnName String Le nom ou alias de la colonne dans le jeu de résultats.
ColumnOrdinal Int32 L’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 Type Le type de données .NET par défaut de la colonne.
DataTypeName String Le type de données SQLite de la colonne.
IsAliased Boolean True si le nom de la colonne a un alias dans le jeu de résultats.
IsAutoIncrement Boolean True si la colonne d’origine a été créée avec le mot clé AUTOINCREMENT.
IsExpression Boolean True si la colonne provient d’une expression dans la requête.
IsKey Boolean True si la colonne d’origine fait partie de la CLÉ PRIMAIRE.
IsUnique Boolean 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 illustre comment utiliser GetSchemaTable pour créer 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ées de 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 du tableau 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