C #: база данных SQLite всегда заблокирована - PullRequest
4 голосов
/ 27 апреля 2011

Я написал простое приложение (назовите его app1), которое читает базу данных SQLite и отображает содержимое в виде таблицы.У меня есть отдельное консольное приложение C # (app2), которое необходимо записать в ту же базу данных.Проблема в том, что app2 завершается с ошибкой «база данных заблокирована».Я вижу, как только я запускаю app1, создается файл userdb-journal.Я предполагаю, что проблема в том, что app1 открывает базу данных, но не освобождает ее?Это код, который у меня есть для заполнения таблицы, которую я связываю с сеткой в ​​приложении 1.

    public DataTable GetAllPeople()
    {
        var connectionString = "Data Source=" + dbPath + ";Version=3";

        using (SQLiteDataAdapter sqlDataAdapter =
            new SQLiteDataAdapter("SELECT id,FirstName,LastName,Address FROM Users",
                                  connectionString))
        {
            using (DataTable dataTable = new DataTable())
            {
                sqlDataAdapter.Fill(dataTable);
                // code to add some new columns here

                return dataTable;
            }
        }
    }

Вот код, который заполняет сетку:

    private void Form1_Load(object sender, EventArgs e)
    {
        UserDatabase db = new UserDatabase();
        db.Initialize();
        dataGridView1.DataSource = db.GetAllPeople();

    }

Как мне исправить вещитак app2 может читать и записывать в базу данных, пока app1 работает?

EDIT Похоже, этот файл журнала создается только app2.Я заметил только ошибку блокировки базы данных, когда приложение app1 также работало, но, возможно, app1 - красная сельдь.Приложение 2 является многопоточным.Возможно, мне следует начать новый вопрос, посвященный app2 и многопоточному доступу?

EDIT Спасибо за все комментарии.Я установил блокировку всех обращений к БД и завернул все в использования.Кажется, теперь все работает.

Ответы [ 2 ]

2 голосов
/ 27 февраля 2012

Вот код, с легкостью установите параметры в конструкторе строк соединений и создайте с ним SQLiteConnection.

 SQLiteConnectionStringBuilder connBuilder = new SQLiteConnectionStringBuilder();
        connBuilder.DataSource = filePath;
        connBuilder.Version = 3;
        connBuilder.CacheSize = 4000;            
        connBuilder.DefaultTimeout = 100;
        connBuilder.Password = "mypass";


        using(SQLiteConnection conn = new SQLiteConnection(connBuilder.ToString()))
        {
            //...
        }

С уважением.

0 голосов
/ 27 апреля 2011

Вы просили SQLITE подождать и повторить попытку, если БД заблокирована? Вот как это сделать в C

 // set SQLite to wait and retry for up to 100ms if database locked
    sqlite3_busy_timeout( db, 100 );

Дело в том, что SQLITE на короткое время блокирует базу данных при обращении к ней. Если другой поток или процесс получает к нему доступ во время блокировки, SQLITE по умолчанию возвращает ошибку. Но вы можете подождать и повторить попытку автоматически с помощью вышеуказанного вызова. Это решает многие из подобных проблем.

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