Почему ExecuteNonQuery перестает работать после двух вставок? - PullRequest
2 голосов
/ 11 марта 2019

У меня проблема с запросами sqlite.Я разрабатываю систему тегов для некоторых видео.

Когда я вставляю видео в свою базу данных, все работает нормально, но когда дело доходит до тегов и video_tag_link, я могу добавить только один, а следующий заставляет мое приложение зависать.

Проблема не 'не приходят из запросов SQL.Я пробую их непосредственно в браузере БД, и они работают нормально.

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

try
{
            if (dbConnection == null)
                await InitDatabaseAsync();

            if (dbConnection.State != System.Data.ConnectionState.Open)
                await dbConnection.OpenAsync();

            SQLiteCommand command = new SQLiteCommand(query, dbConnection);
            await command.ExecuteNonQueryAsync();

            onDataReturned?.Invoke(command.ExecuteReader());

            dbConnection.Close();
        }
        catch (SQLiteException ex)
        {
            Console.WriteLine(ex);
            dbConnection.Close();
        }

Вот мой запрос на тег:

BEGIN TRANSACTION;
INSERT INTO tags (name) VALUES ('Test Tag');
INSERT INTO tag_video_link (video_id, tag_id) VALUES (2, (SELECT id FROM tags ORDER BY id DESC LIMIT 1));
COMMIT;

Я не знаю, как сработала моя генерация тестовых данных, которая вставляет 100 строк, но вставка 1 тега со ссылкой на видео не работает.

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

Может ли кто-нибудь мне помочь?

PS: Извините, если я допустил орфографические ошибки или я не очень ясно, я нечасто говорю по-английски.

1 Ответ

0 голосов
/ 12 марта 2019

Сложно догадаться, где что-то может пойти не так с данным примером кода, но конструкция «using» может помочь обеспечить освобождение ресурсов:

using (var conn = new SQLiteConnection(connectionString))
{
    using (var cmd = new SQLiteCommand(query, conn))
    {
        await conn.OpenAsync();
        using (var reader = await cmd.ExecuteReaderAsync())
        {
             onDataReturned?.Invoke(reader);       
        }
    }
}
...