2

我在Fluent NHibernate 项目中使用 SQLite ( system.data.sqlite v. 1.0.60.0 )。

我有一个程序写入数据库,另一个程序从中读取。有时,我会遇到 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 数据库的简单共享访问?

4

2 回答 2

1

SetTimeout是 NHibernate 查询接口ICriteriaIQuery.

例子:

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();
}
于 2010-06-21T23:43:20.117 回答
1

就像你说的,SetTimeout() 是 internal,所以你(或 NHibernate)不能调用它。该方法仅包装
sqlite_busy_timeout和抛出,您绝对不想在应用程序代码中使用那些不安全的方法。

据此 SQLite 提供程序应重试 30 秒。

于 2010-06-22T23:05:59.237 回答