【问题标题】:Wrong SQL statements being generated when using System.Data.SQLite.Linq使用 System.Data.SQLite.Linq 时生成错误的 SQL 语句
【发布时间】:2013-09-07 20:05:54
【问题描述】:

有人在他们的项目中成功使用过 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 builder?

我的 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。这证实了我的怀疑,即我遗漏了一些明确引用它的东西,但我不知道它是什么。

谢谢!

【问题讨论】:

  • 你使用了什么 DBconnection 类?
  • 我正在使用 SQLiteConnection: string connectionString = @"Data Source=" + databasePath + ";provider=System.Data.SQLite"; SQLiteConnection db = new SQLiteConnection(Config.ConnectionString); using (DataContext dc = new DataContext(db)) { // 代码放在这里; }

标签: c# sql linq sqlite


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    我发现 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

    【讨论】:

      猜你喜欢
      • 2021-04-09
      • 1970-01-01
      • 2018-10-10
      • 2014-06-08
      • 2022-12-02
      • 2020-12-06
      • 2019-02-13
      • 1970-01-01
      • 2020-05-26
      相关资源
      最近更新 更多