我正在使用SQLite.NET来访问我的数据库,在一个特定情况下,我需要获取一个表模式,因为它是特定于应用程序的。
我一直在浏览SQLite.NET论坛和谷歌,看起来非常简单。如果我有一个名为MYTABLE的表,我应该可以这样做:
DataTable dt = Connection.GetSchema( SQLiteMetaDataCollectionNames.Columns, new string[] { null, null, "MYTABLE", null });
问题是,虽然我确实得到了一个DataTable,但它中包含了所有错误的信息。具体来说,这就是我对MYTABLE的假设列的回归:
- [0] {TABLE_CATALOG} object {System.Data.DataColumn}
- [1] {TABLE_SCHEMA} object {System.Data.DataColumn}
- [2] {TABLE_NAME} object {System.Data.DataColumn}
- [3] {COLUMN_NAME} object {System.Data.DataColumn}
- [4] {COLUMN_GUID} object {System.Data.DataColumn}
- [5] {COLUMN_PROPID} object {System.Data.DataColumn}
- [6] {ORDINAL_POSITION} object {System.Data.DataColumn}
- [7] {COLUMN_HASDEFAULT} object {System.Data.DataColumn}
- [8] {COLUMN_DEFAULT} object {System.Data.DataColumn}
- [9] {COLUMN_FLAGS} object {System.Data.DataColumn}
- [10] {IS_NULLABLE} object {System.Data.DataColumn}
- [11] {DATA_TYPE} object {System.Data.DataColumn}
- [12] {TYPE_GUID} object {System.Data.DataColumn}
- [13] {CHARACTER_MAXIMUM_LENGTH} object {System.Data.DataColumn}
- [14] {CHARACTER_OCTET_LENGTH} object {System.Data.DataColumn}
- [15] {NUMERIC_PRECISION} object {System.Data.DataColumn}
- [16] {NUMERIC_SCALE} object {System.Data.DataColumn}
- [17] {DATETIME_PRECISION} object {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] {COLLATION_CATALOG} object {System.Data.DataColumn}
- [22] {COLLATION_SCHEMA} object {System.Data.DataColumn}
- [23] {COLLATION_NAME} object {System.Data.DataColumn}
- [24] {DOMAIN_CATALOG} object {System.Data.DataColumn}
- [25] {DOMAIN_NAME} object {System.Data.DataColumn}
- [26] {DESCRIPTION} object {System.Data.DataColumn}
- [27] {PRIMARY_KEY} object {System.Data.DataColumn}
- [28] {EDM_TYPE} object {System.Data.DataColumn}
- [29] {AUTOINCREMENT} object {System.Data.DataColumn}
- [30] {UNIQUE} object {System.Data.DataColumn}
谁能告诉我这里做错了什么?
2 个答案:
答案 0 :(得分:4)
SQLiteConnection.GetSchema
很可能被打破;大多数程序不需要此功能。
您可以通过执行PRAGMA table_info(MYTABLE)
command来获得所需内容;你应该得到一个数据阅读器,每列有一行。
答案 1 :(得分:1)
以下是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;
}