Получение схемы таблицы не похоже на работу с System.Data.SQLite - PullRequest
4 голосов
/ 17 июля 2010

Я использую SQLite.NET для доступа к базам данных, и в одном конкретном случае мне нужно получить схему таблицы, потому что она зависит от приложения.

Я просматривал форум SQLite.NET и Google, и это кажется очень простым. Если у меня есть таблица с именем MYTABLE, я смогу сделать это:

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

Проблема в том, что, хотя я возвращаю DataTable, в нем содержится вся неверная информация. В частности, это то, что я возвращаю для предполагаемых столбцов MYTABLE:

  • [0] {TABLE_CATALOG} объект {System.Data.DataColumn}
  • [1] {TABLE_SCHEMA} объект {System.Data.DataColumn}
  • [2] {TABLE_NAME} объект {System.Data.DataColumn}
  • [3] {COLUMN_NAME} объект {System.Data.DataColumn}
  • [4] {COLUMN_GUID} объект {System.Data.DataColumn}
  • [5] {COLUMN_PROPID} объект {System.Data.DataColumn}
  • [6] {ORDINAL_POSITION} объект {System.Data.DataColumn}
  • [7] {COLUMN_HASDEFAULT} объект {System.Data.DataColumn}
  • [8] {COLUMN_DEFAULT} объект {System.Data.DataColumn}
  • [9] {COLUMN_FLAGS} объект {System.Data.DataColumn}
  • [10] {IS_NULLABLE} объект {System.Data.DataColumn}
  • [11] {DATA_TYPE} объект {System.Data.DataColumn}
  • [12] {TYPE_GUID} объект {System.Data.DataColumn}
  • [13] {CHARACTER_MAXIMUM_LENGTH} объект {System.Data.DataColumn}
  • [14] {CHARACTER_OCTET_LENGTH} объект {System.Data.DataColumn}
  • [15] {NUMERIC_PRECISION} объект {System.Data.DataColumn}
  • [16] {NUMERIC_SCALE} объект {System.Data.DataColumn}
  • [17] {DATETIME_PRECISION} объект {System.Data.DataColumn}
  • [18] {CHARACTER_SET_CATALOG} объект {System.Data.DataColumn}
  • [19] {CHARACTER_SET_SCHEMA} объект {System.Data.DataColumn}
  • [20] {CHARACTER_SET_NAME} объект {System.Data.DataColumn}
  • [21] {COLLATION_CATALOG} объект {System.Data.DataColumn}
  • [22] {COLLATION_SCHEMA} объект {System.Data.DataColumn}
  • [23] {COLLATION_NAME} объект {System.Data.DataColumn}
  • [24] {DOMAIN_CATALOG} объект {System.Data.DataColumn}
  • [25] {DOMAIN_NAME} объект {System.Data.DataColumn}
  • [26] {DESCRIPTION} object {System.Data.DataColumn}
  • [27] {PRIMARY_KEY} объект {System.Data.DataColumn}
  • [28] {EDM_TYPE} объект {System.Data.DataColumn}
  • [29] {AUTOINCREMENT} object {System.Data.DataColumn}
  • [30] {UNIQUE} объект {System.Data.DataColumn}

Может кто-нибудь сказать мне, что я здесь не так сделал?

Ответы [ 2 ]

4 голосов
/ 17 июля 2010

Вполне возможно, что SQLiteConnection.GetSchema сломан;большинству программ эта функция не нужна.

Вы можете получить то, что вам нужно, выполнив команду PRAGMA table_info(MYTABLE) ;Вы должны получить устройство для чтения данных с одной строкой для каждого столбца.

1 голос
/ 10 июля 2017

Вот пример того, как использовать 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;
}
...