Ошибка SQLite: «база данных не открыта» при добавлении таблицы - PullRequest
0 голосов
/ 21 октября 2018

Я пишу приложение, используя C # и System.Data.SQLite (библиотека из https://system.data.sqlite.org), и чувствую, что бьюсь головой об стену. Мои модульные тесты на моих больших кусках кодаслучайным образом генерируют исключения, поэтому, готовясь задать вопрос здесь, я начал новый проект с как можно меньшим количеством кода. Этот кусок кода, который создает новый файл sqlite, а затем добавляет к нему таблицу, продолжает выдавать ошибку Database is not open всякий раз, когда пытается добавить таблицу.

Глядя на похожие вопросы о переполнении стека, многие из них касаются использования SQLite с Android, что здесь не так.

В своем исследовании я видел, что хочу держать соединение открытым только столько, сколько мне нужно, но, как вы можете видеть из примера кода, я использую using для изоляции соединения.и команда рядом друг с другом, но у меня все еще есть проблемы.

Возможно, что-то очевидно, что я делаю неправильно, но я не могу понять, что это такое.

Спасибо!

using System.Data.SQLite;

namespace SmallCode {
    class Program {
        private const string DB_NAME = "Test.sqlite";
        private const string DB_CONN_STRING = "Data Source=" + DB_NAME + ";Version=3;";

        static void Main(string[] args) {
            Program p = new Program();
            SQLiteConnection.CreateFile(DB_NAME);

            using (SQLiteConnection c = new SQLiteConnection(DB_CONN_STRING)) {
                string sqlCreateTableAccount = "CREATE TABLE ACCOUNT (ID INTEGER PRIMARY KEY, NAME TEXT NOT NULL);";
                using (SQLiteCommand cmd = new SQLiteCommand(sqlCreateTableAccount, c)) {
                    // EXCEPTION THROWN ON NEXT LINE
                    cmd.ExecuteNonQuery();
                }
            }
        }
    }
}

1 Ответ

0 голосов
/ 21 октября 2018

Вам все еще нужно .Open соединение ...

using (SQLiteConnection c = new SQLiteConnection(DB_CONN_STRING)) {
    c.Open();  //<------ ADD THIS LINE
    string sqlCreateTableAccount = "CREATE TABLE ACCOUNT (ID INTEGER PRIMARY KEY, NAME TEXT NOT NULL);";
    using (SQLiteCommand cmd = new SQLiteCommand(sqlCreateTableAccount, c)) {
        // EXCEPTION THROWN ON NEXT LINE
        cmd.ExecuteNonQuery();
    }
 }

Создание соединения с помощью using не открывает соединение автоматически, оно просто создает его.Вам не нужно явно .Close() это в конце, хотя оно будет закрыто, когда использование утилизирует его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...