Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
danyasworld
5 / 5 / 1
Регистрация: 12.04.2015
Сообщений: 227
Завершенные тесты: 1
1

Узнать состояние SQLiteConnection

09.12.2015, 00:25. Просмотров 1457. Ответов 18
Метки нет (Все метки)

работаю с базой данных SQLite. Из за того что она не дает держать открытыми несколько подключений сразу - приходится закрывать одно и открывать другое. Можно ли как то узнать, в ком состоянии в данный момент Connection? (к тому моменту когда нужно проверить - Connection уже существует, не равняется null, содержит в себе все необходимые данные) но как отличить закрытое соединение от открытого? перебор английских слов которые могли охарактеризовать это состояние ничего не дал, так что я вот тут и прошу Вашей помощи)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2015, 00:25
Ответы с готовыми решениями:

SQLiteConnection: "No connection associated with this command"
SQLiteConnection connect = new SQLiteConnection(string.Format("Data...

Как узнать текущее состояние процесса
Здравствуйте уважаемые эксперты. Собственно вопрос стоит в названии темы, как...

Как из одного потока узнать состояние другого потока
Подскажите пожалуйста, как из одного потока узнать, что другой поток еще не...

Состояние ProcessThread
Замораживаю потоки так: static extern IntPtr OpenThread(ThreadAccess...

Определить состояние запроса
Нужно при успехе вывести в консоль "Успешно!" к примеру, метод запроса такой: ...

18
NewOrdered
403 / 180 / 64
Регистрация: 25.05.2012
Сообщений: 826
Записей в блоге: 1
09.12.2015, 11:08 2
danyasworld,
https://msdn.microsoft.com/ru-ru/lib...v=vs.110).aspx

Добавлено через 6 минут
но наверное правильней было бы использовать объект SQLiteConnection с оператором using

C#
1
2
3
4
using(SQLiteConnection cn = new SQLiteConnection("строка подключения"))
{
     //действия
}
Оператор using гарантирует вызов метода Dispose, даже если при вызове методов в объекте происходит исключение.
0
danyasworld
5 / 5 / 1
Регистрация: 12.04.2015
Сообщений: 227
Завершенные тесты: 1
09.12.2015, 12:40  [ТС] 3
NewOrdered, но после dispose создать обьект sqliteconnection не представляется возможным. Вылетает exception
0
NewOrdered
403 / 180 / 64
Регистрация: 25.05.2012
Сообщений: 826
Записей в блоге: 1
09.12.2015, 13:50 4
danyasworld, покажите код

Добавлено через 2 минуты
и текст исключения, разумеется
0
lemeserg
34 / 23 / 12
Регистрация: 08.04.2013
Сообщений: 266
Завершенные тесты: 1
13.12.2015, 11:03 5
Может и неправильно, но я делаю так:
C#
1
2
3
4
5
private void db_status()
        {
            if (Connection.State.ToString() == "Open") { };
            if (Connection.State.ToString() == "Closed") Connection.Open();
        }
0
OwenGlendower
Супер-модератор
Эксперт .NET
10219 / 8823 / 3775
Регистрация: 17.03.2014
Сообщений: 17,735
Записей в блоге: 1
13.12.2015, 13:48 6
lemeserg, создавай подключение заново каждый раз. То есть создали новый SQLiteConnection, открыли его, сделали запрос(ы), закрыли соединение.
0
danyasworld
5 / 5 / 1
Регистрация: 12.04.2015
Сообщений: 227
Завершенные тесты: 1
13.12.2015, 14:31  [ТС] 7
OwenGlendower, а смысл в этом действии? Не логичнее ли открыть один раз при запуске формы и закрыть при его закрытии?
0
OwenGlendower
Супер-модератор
Эксперт .NET
10219 / 8823 / 3775
Регистрация: 17.03.2014
Сообщений: 17,735
Записей в блоге: 1
13.12.2015, 14:51 8
danyasworld, потому что это правильный способ работы с соединением с базой данных. Время потраченное на его создание наверняка будет меньше чем время на выполнение запроса и обработку результата. Тем более что тебе все равно необходимо открывать два разных соединения.
0
danyasworld
5 / 5 / 1
Регистрация: 12.04.2015
Сообщений: 227
Завершенные тесты: 1
13.12.2015, 14:58  [ТС] 9
OwenGlendower, мне не нужно два разных соеденения...
0
lemeserg
34 / 23 / 12
Регистрация: 08.04.2013
Сообщений: 266
Завершенные тесты: 1
13.12.2015, 15:18 10
Тогда однозначно мой метод. Гораздо эффективнее вызвать метод проведения проверки на открытость соединения, чем каждый раз создавать новое соединение, открывать его и закрывать.
В данном случае сравнить только можно с общей темповой переменной, которую "пользуют все" на примере строки. Зачем создавать string tmp1, tmp2, tmp3 если можно использовать только tmp1 и никому это не будет мешать?

Добавлено через 7 минут
Кликните здесь для просмотра всего текста
По поводу открытия/закрытия соединения честно говоря можно и поспорить. Если для тяжелых многопользовательских сетевых баз это еще актуально, то для SQLite происходит не просто коннект, а полноценное открытие/закрытие файла, со всеми вытекающими. Легкий файлик откроется быстро, а если он будет размером 2-3Гб?
0
OwenGlendower
Супер-модератор
Эксперт .NET
10219 / 8823 / 3775
Регистрация: 17.03.2014
Сообщений: 17,735
Записей в блоге: 1
13.12.2015, 15:54 11
danyasworld, если не хочешь открывать соединение заново, то проверяй свойство State и добавь try/catch при выполнении запроса чтобы отловить ошибки с связанные с открытым соединением.

Цитата Сообщение от lemeserg Посмотреть сообщение
Тогда однозначно мой метод.
NewOrdered раньше тебя это предложил В целом вариант как вариант хотя я не уверен что State в отражает 100% реальное состояние соединения. Ну и если так и делать, то сравнивать нужно не со строкой, а со значениями ConnectionState.

Цитата Сообщение от lemeserg Посмотреть сообщение
Если для тяжелых многопользовательских сетевых баз это еще актуально, то для SQLite происходит не просто коннект, а полноценное открытие/закрытие файла, со всеми вытекающими. Легкий файлик откроется быстро, а если он будет размером 2-3Гб?
С какими именно вытекающими? Ты серьезно считаешь что открытие базы данных требует "перелопачивания" всего файла?
0
lemeserg
34 / 23 / 12
Регистрация: 08.04.2013
Сообщений: 266
Завершенные тесты: 1
13.12.2015, 16:20 12
OwenGlendower,
В коде, предложенном NewOrdered предлагается использовать НОВОЕ соединение. А новое соединение, это по сути вновь создаваемый метод. Чем это лучше моей строки подключения и маленького метода проверки открыт/закрыт? С ConnectionState у меня не получилось нормально работать, возможно(скорее всего) руки кривые.

Цитата Сообщение от OwenGlendower Посмотреть сообщение
С какими именно вытекающими? Ты серьезно считаешь что открытие базы данных требует "перелопачивания" всего файла?
По крайней мере я так думал. Сейчас проверил, действительно не перелопачивает. Однако это не снимает моего вопроса по целесообразности проведения лишних, на мой взгляд, операций.
З.Ы. сам всегда и открываю и закрываю соединение, но вот зачем - не понимаю.
0
OwenGlendower
Супер-модератор
Эксперт .NET
10219 / 8823 / 3775
Регистрация: 17.03.2014
Сообщений: 17,735
Записей в блоге: 1
13.12.2015, 16:36 13
Цитата Сообщение от lemeserg Посмотреть сообщение
В коде, предложенном NewOrdered предлагается использовать НОВОЕ соединение.
Он предложил два решения и первым было проверка ConnectionState.

Цитата Сообщение от lemeserg Посмотреть сообщение
А новое соединение, это по сути вновь создаваемый метод.
В смысле?

Цитата Сообщение от lemeserg Посмотреть сообщение
С ConnectionState у меня не получилось нормально работать, возможно(скорее всего) руки кривые.
C#
1
2
3
4
5
private void db_status()
{
    if (Connection.State == ConnectionState.Open) { };
    if (Connection.State == ConnectionState.Closed) Connection.Open();
}
Цитата Сообщение от lemeserg Посмотреть сообщение
Однако это не снимает моего вопроса по целесообразности проведения лишних, на мой взгляд, операций.
Microsoft рекомендует держать соединения открытыми как можно короче. Однако для БД таких как SQLite возможно эффективнее постоянно держать одно соединение открытым. Особенно если активно используются prepared statements. На stackoverflow есть хороший ответ по теме.
3
danyasworld
5 / 5 / 1
Регистрация: 12.04.2015
Сообщений: 227
Завершенные тесты: 1
13.12.2015, 17:08  [ТС] 14
В моем случае открывать закрывать соеденение постояно - не вариант. У меня форма с 10 страницами, каждая из которых пользуясь открытым соединением формы считывает и вносит информацию в базу данных. Просто с точки зрения кода проще открыть и закрыть по одному разу,чтоб не писать лишних 20 строк, но тк в момент создания формы строки подключения еще не существует, пришлось сделать подключение на второй странице. Из за структуры программы есть возможность пройти место открытия подключение 2 и более раз. Я не спрашивал когда и как мне открывать и закрывать подключение, я просто спросил как проверить его состояние. И получил четкий ответ.
C#
1
if(conn.State == ConnectionState.чтототам){}
Больше мне ничего не надо было
0
danyasworld
5 / 5 / 1
Регистрация: 12.04.2015
Сообщений: 227
Завершенные тесты: 1
16.12.2015, 18:21  [ТС] 15
А теперь такой вопрос(конечно надо было создать новую тему, но вопросы очень близки по теме, так что спрашиваю здесь) На форме контролов 20, делятся они на 2 типа - комбобоксы и текст боксы. Развожу обработку на два потока - в одном комбобоксы, в другом чекбоксы. Потом свожу в один и делаю запрос к бд на основе результатов работы этих двух потоков. Одновременно с этим НИЧЕГО не читается с базы, и ничего в нее не вносится.Но постоянно вылетает эксэпшн "Database is locked" смотрел пошагово с точками останова - это место проходится один раз, параллельно ничего больше не работает с бд.
Можно ли узнать что именно мешает мне ввести данные?
0
insite2012
Модератор
Эксперт .NET
4874 / 3827 / 1096
Регистрация: 12.10.2013
Сообщений: 11,100
Записей в блоге: 2
16.12.2015, 18:29 16
Цитата Сообщение от danyasworld Посмотреть сообщение
Но постоянно вылетает эксэпшн "Database is locked"
Вот и ответ. Установите потоковую блокировку там, где это требуется.
0
danyasworld
5 / 5 / 1
Регистрация: 12.04.2015
Сообщений: 227
Завершенные тесты: 1
16.12.2015, 18:40  [ТС] 17
insite2012, а можно по подробнее?
0
insite2012
Модератор
Эксперт .NET
4874 / 3827 / 1096
Регистрация: 12.10.2013
Сообщений: 11,100
Записей в блоге: 2
16.12.2015, 19:22 18
Цитата Сообщение от danyasworld Посмотреть сообщение
можно по подробнее?
В простом варианте примерно так.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication25 {
    class Program {
        static void Main(string[] args) {
        }
    }
    class DatabaseProvider {
        object locker = new object();
        public void AddData() {
            lock (locker) {
                //Тут код работающий с БД
            }
        }
        public void ChangeData() {
            lock (locker) {
                //Тут код работающий с БД
            }
        }
    }
}
2
danyasworld
5 / 5 / 1
Регистрация: 12.04.2015
Сообщений: 227
Завершенные тесты: 1
17.12.2015, 19:32  [ТС] 19
insite2012, как бы странно это не казалось - но ожидаемого результата это не дало (и без lock все раньше отлично работало) а все дело оказалось что я открыл параллельно sqlite browser, он то и мешал моему коду(т к был подключен к той же бд) но метод интересный, спасибо буду знать
0
17.12.2015, 19:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2015, 19:32

Проверить состояние подключения
Добрый день всем. Никак не могу найти как проверить подключение, открыто оно...

Получение состояние принтера
Доброго времени суток. Возникла небольшая проблема связанная как обычно с...

Проверить состояние VPN подключений
Как можно проверить состояние VPN подключений, подключено оно или нет?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru