2

有人在他们的项目中成功使用过 System.Data.SQLite.Linq 吗?

即使在我的项目参考中包含此 DLL 之后,很明显 Linq 在构建适当的 SQL 语句时调用了错误的提供程序。它使用以下语句在 SQLiteCommand 中引发异常:

INSERT INTO [Inbox]
    ([Sender], [Subject], [Body], [Date], [ConversationID], [RemoteID], [ReplyTo])
VALUES
    (@p0, @p1, @p2, @p3, @p4, @p5, @p6)

SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]

SCOPE_IDENTITYSQLite 中无效。在构建 SQL 语句时,如何直接System.Data.SQLite.DLL使用 SQLite Linq SQL 构建器?

我的 DbProviderFactories 是:

  <DbProviderFactories>
    <remove invariant="System.Data.SQLite"/>
    <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.88.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139"/>
  </DbProviderFactories>

这个对吗?

附加信息。System.Data.SQLite.Linq.dll当我的应用程序被加载时,即使它位于 bin 文件夹中,我也没有在 VS2012 的模块列表中看到它。这证实了我的怀疑,即我错过了明确引用它的东西,但我无法弄清楚它是什么。

谢谢!

4

2 回答 2

2

根据进一步的研究,似乎:

  1. System.Data.SQLite.Linq.dllDataContext基础类不能使用。可能可以将其与ObjectContext. 我正在调查。如果 SQLite.Data 人员能澄清这一点会很好,但我会单独跟进。

  2. DbLinq是一种替代方法,但是当我尝试它时,它对 Blob 数据的处理似乎被破坏了。具体来说,它似乎使用字典来存储 blob 项,并将字典中的每个字节存储为一个值,并将偏移量作为键。那速度慢得可怕。此外,当使用比旧值更大的新值更新 blob 时,它会崩溃。

  3. Linq2Sql似乎没有得到维护,由于一些模糊的错误,我根本无法让它工作。可能我的要求比它的能力要多一点。

理想情况下ObjectContext会起作用。如果做不到这一点,我将放弃 Linq 并转而使用直接 SQLite 访问。不过,我仍然欢迎其他任何设法让 Linq 与 SQLite 一起工作的人提供见解。我的是一个开源项目,所以我不想使用商业提供商。

于 2013-09-08T09:31:12.513 回答
1

我发现 System.Data.SQLite.Linq 非常有问题。

使用 DataContext 的 log 方法有助于根据此答案查看生成的 SQL https://stackoverflow.com/a/8729736/74585

StringBuilder logBuilder = new StringBuilder();
db.Log = new StringWriter(logBuilder);
string sql = logBuilder.ToString();

例如,linq 方法 .First() 将使用 SELECT TOP (1) ... 生成 SQL,但 Sqlite 不支持 TOP (1)。我不得不通过跟踪和错误发现很多这样的错误。

使用 LINQ 访问表中的第一个元素时出现 SQLite 错误

于 2014-12-08T08:29:48.523 回答