Может ли кто-нибудь предоставить пример SQLite "SetTimeout" на C #? - PullRequest
2 голосов
/ 22 июня 2010

Я использую SQLite ( system.data.sqlite v. 1.0.60.0 ) в проекте Fluent NHibernate.

У меня есть одна программа, которая пишет в БД, а другая - из нее. Иногда я получаю исключения SQLITE_BUSY, и мне нужно это исправить.

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

Однако в сборке system.data.sqlite этого нет.

Когда я ищу SetTimeout с помощью Обозревателя объектов, я получаю два попадания:

System.Data.SQLite.SQLite3.SetTimeout (INT)

System.Data.SQLite.SQLiteBase.SetTimeout (INT)

но я не могу использовать их в своем коде - они не отображаются в Intellisense, а VS2008 показывает красное подчеркивание для SQLite3 с сообщением «Не удается получить доступ к внутреннему классу здесь».

Может кто-нибудь дать мне пример (в C #), который показывает точный синтаксис для этого метода?

Или это даже правильный подход? Я мог бы проверить SQLITE_BUSY в своем коде, но не нашел ни одного хорошего примера, демонстрирующего этот подход.

Наконец, есть ли у Fluent NHibernate или NHibernate какие-либо механизмы, обеспечивающие простой общий доступ к базе данных SQLite?

Ответы [ 2 ]

1 голос
/ 23 июня 2010

Как вы сказали, SetTimeout () является внутренним , поэтому вы (или NHibernate) не можете вызвать его. Метод только обертки
sqlite_busy_timeout и throws, и вы определенно не хотите использовать эти небезопасные методы в коде приложения.

В соответствии с этим поставщик SQLite должен повторить попытку в течение 30 секунд.

1 голос
/ 22 июня 2010

SetTimeout является членом обоих интерфейсов запросов NHibernate, ICriteria и IQuery.

Пример:

using (var session = sessionFactory.OpenSession())
using (var tx = session.BeginTransaction())
{
    var items = session.CreateQuery("select something complex from a big table")
                       .SetTimeout(600) // 10 minutes
                       .List();
    tx.Commit();
}
...