代码之家  ›  专栏  ›  技术社区  ›  Dave

获取表架构似乎不适用于System.Data.sqlite

  •  4
  • Dave  · 技术社区  · 14 年前

    我正在使用sqlite.net访问我的数据库,在一个特定的情况下,我需要得到一个表模式,因为它是特定于应用程序的。

    我一直在浏览sqlite.net论坛和谷歌,这看起来非常简单。如果我有一个名为mytable的表,我应该可以这样做:

    DataTable dt = Connection.GetSchema( SQLiteMetaDataCollectionNames.Columns, new string[] { null, null, "MYTABLE", null });
    

    问题是,尽管我确实得到了一个数据表,但它包含了所有错误的信息。具体来说,这是我为我的表的假定列所得到的:

    • [0]表目录对象System.Data.DataColumn
    • [1]表架构对象System.Data.DataColumn
    • [2]表名称对象System.Data.DataColumn
    • [3]列名称对象System.Data.DataColumn
    • [4]column_guid object_system.data.data column_
    • [5]column propid object_system.data.data column_
    • [6]序号位置对象System.Data.DataColumn
    • [7]列默认对象System.Data.DataColumn
    • [8]列默认对象System.Data.DataColumn
    • [9]列标志对象System.Data.DataColumn_
    • [10]is_nullable object_system.data.datacolumn_
    • [11]数据类型对象System.Data.DataColumn
    • [12]type_guid object_system.data.datacolumn_
    • [13]character_maximum object_system.data.datacolumn_
    • [14]字符八位字节长度对象System.Data.DataColumn
    • [15]数字精度对象System.Data.DataColumn
    • [16]数字对象System.Data.DataColumn
    • [17]日期时间精度对象System.Data.DataColumn
    • [18]character_set catalog object_system.data.datacolumn_
    • [19]character_set schema object_system.data.datacolumn_
    • [20]character_set name object_system.data.datacolumn_
    • [21]排序规则目录对象System.Data.DataColumn
    • [22]排序规则架构对象System.Data.DataColumn
    • [23]排序规则名称对象System.Data.DataColumn
    • [24]域目录对象System.Data.DataColumn
    • [25]域名对象System.Data.DataColumn
    • [26]描述对象System.Data.DataColumn
    • [27]主键对象System.Data.DataColumn
    • [28]edm_type object_system.data.datacolumn_
    • [29]自动增量对象System.Data.DataColumn
    • [30]唯一对象System.Data.DataColumn

    有人能告诉我我在这里做错了什么吗?

    2 回复  |  直到 7 年前
        1
  •  4
  •   Stephen Cleary    14 年前

    很有可能 SQLiteConnection.GetSchema 已损坏;大多数程序不需要此功能。

    你可以通过执行 PRAGMA table_info(MYTABLE) command ;您应该得到一个数据阅读器,每列有一行。

        2
  •  1
  •   Peet    7 年前

    下面是如何使用 PRAGMA table_info(tableName) 正如建议的那样 Stephen Cleary 检查指定表中是否存在指定列。

    /// <summary>
    /// Checks if the given table contains a column with the given name.
    /// </summary>
    /// <param name="tableName">The table in this database to check.</param>
    /// <param name="columnName">The column in the given table to look for.</param>
    /// <param name="connection">The SQLiteConnection for this database.</param>
    /// <returns>True if the given table contains a column with the given name.</returns>
    public static bool ColumnExists(string tableName, string columnName, SQLiteConnection connection)
    {
        var cmd = new SQLiteCommand("PRAGMA table_info(" + tableName + ")", connection);
        var dr = cmd.ExecuteReader();
        while (dr.Read())//loop through the various columns and their info
        {
            var value = dr.GetValue(1);//column 1 from the result contains the column names
            if (columnName.Equals(value))
            {
                dr.Close();
                return true;
            }
        }
    
        dr.Close();
        return false;
    }