Соединение с базой данных не открыто? - PullRequest
0 голосов
/ 06 июля 2018

В настоящее время я работаю над приложением UWP, использующим пространство имен Microsoft.Data.Sqlite.

Я могу записать данные в базу данных и все, но когда я хочу удалить базу данных, я получаю сообщение об ошибке ExecuteNonQuery can only be called when the connection is open.

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

Это код, который я использую для инициализации базы данных:

public static void InitializeDatabase()
{
    using (SqliteConnection db =
        new SqliteConnection($"Filename=DashboardDatabase.db"))
    {
        db.Open();

        const string tableCommand = "CREATE TABLE IF NOT EXISTS " +
                                    "VisibilityTable (" +
                                    "ParameterId INTEGER NOT NULL PRIMARY KEY, " +
                                    "UserVisibility INTEGER NOT NULL, " +
                                    "GeneralVisibility INTEGER NOT NULL, " +
                                    "Format TEXT NOT NULL)";

        SqliteCommand createTable = new SqliteCommand(tableCommand, db);

        try
        {
            createTable.ExecuteReader();
        }
        catch (SqliteException sqliteException)
        {
            Log.Logger.Error("An Error occurred while creating a table in the database:");
            Log.Logger.Error(sqliteException.Message);
        }

        db.Close();
    }
}

И это код, который я использую для удаления таблицы и который создает ошибку, как только он хочет запустить метод ExecuteNonQuery.

public static void DeleteTable()
{
    using (SqliteConnection db = new SqliteConnection("Filename=DashboardDatabase.db"))
    {
        db.Open();

        SqliteCommand deleteCommand = new SqliteCommand("DROP TABLE VisibilityTable");

        deleteCommand.ExecuteNonQuery();

        db.Close();
    }
}

Я был бы очень признателен за помощь в этой ситуации.

EDIT:

Как отметил JayV в комментариях, мне не удалось добавить деталь в SqliteCommand ...

Таким образом, решение было изменить эту строку:

SqliteCommand deleteCommand = new SqliteCommand("DROP TABLE VisibilityTable");

к этому:

SqliteCommand deleteCommand = new SqliteCommand("DROP TABLE VisibilityTable", db);

1 Ответ

0 голосов
/ 06 июля 2018

При создании объекта deleteCommand вы забыли добавить к нему соединение с базой данных.

Изменить строку:

SqliteCommand deleteCommand = new SqliteCommand("DROP TABLE VisibilityTable");

до:

SqliteCommand deleteCommand = new SqliteCommand("DROP TABLE VisibilityTable", db);

Кроме того, вам следует рассмотреть возможность упаковки всего вызова в using(..) блок, как вы это делали с Connection.

Пример:

using(SqliteCommand deleteCommand = new SqliteCommand("DROP TABLE VisibilityTable", db))
{
    deleteCommand.ExecuteNonQuery();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...