使用System.Data.SQLite.Linq时生成错误的SQL语句

时间:2013-09-07 20:05:54

标签: c# sql linq sqlite

有人在他们的项目中成功使用过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_IDENTITY在SQLite中无效。在构造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>

这是正确的吗?

其他信息。我的应用程序加载后,即使它位于bin文件夹中,我也看不到VS2012中的模块列表中的System.Data.SQLite.Linq.dll。这证实了我怀疑我遗漏了明确引用它的东西,但我无法弄清楚它是什么。

谢谢!

2 个答案:

答案 0 :(得分:2)

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

    基于System.Data.SQLite.Linq.dll的类无法使用
  1. DataContext。可以将其与ObjectContext一起使用。我正在调查。如果SQLite.Data人员会澄清这一点会很好,但我会单独跟进。

  2. DbLinq是另一种选择,但是当我尝试它时,它对Blob数据的处理似乎被打破了。具体来说,它似乎使用blob项的字典并将字典中的每个字节存储为偏移量作为键的值。那非常慢。此外,在使用大于旧值的blob更新blob时崩溃了。

  3. Linq2Sql似乎没有被维护,由于一些模糊的错误,我根本无法让它工作。可能我的要求不仅仅是它的能力。

  4. 理想情况下ObjectContext会奏效。如果做不到这一点,我将放弃Linq并重新使用直接的SQLite访问权限。我仍然欢迎其他任何能够让Linq与SQLite合作的人的见解。我是一个开源项目,所以我不想使用商业提供商。

答案 1 :(得分: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)。我不得不通过追踪和错误发现很多这样的错误。

SQLite error when accessing first element in table using LINQ