【问题标题】:SQLite Connection Opens but Can't Read Data, Code Execution StopsSQLite 连接打开但无法读取数据,代码执行停止
【发布时间】:2014-04-11 17:30:52
【问题描述】:

女士们先生们,我已经在这个问题上待了几天,但我无法弄清楚。我有一个应用程序,我在其中打开到 SQLite DB 的连接并从表中选择一些数据。连接打开正常。当我尝试使用 ExecuteReader 通过 SQLiteDataAdapter 或 SQLiteCommand 对象读取数据时,我的代码似乎只是停止执行,就好像它到达了最后一条语句一样。没有异常,EventViewer中什么都没有。它只是表现得像它到达了代码的末尾,程序处于空闲状态。

我发现 this article 与我遇到的行为几乎相同。

关于我所做的一些简要信息:

  • 我已经安装了 SQLite 32 位和 64 位二进制文​​件。
  • 我尝试在使用 32 位 SQLite 二进制文件时将 CPU 类型设置为 x86
  • 我尝试在使用 64 位 SQLite 二进制文件时将 CPU 类型设置为 x64
  • 我尝试使用 adapter.Fill(),代码停止了
  • 我尝试使用 command.ExecuteReader(),代码停止了
  • 如果我没有在 ExecuteReader() 之前打开连接,它就会爆炸,表明连接没有打开,所以它至少能够通信并知道 SQLite 是什么,对吧?

我的代码:

SQLiteConnection connection = new SQLiteConnection
    ("Data Source=" + srcFile + ";Version=3;New=False;Compress=True;");
SQLiteCommand command = new SQLiteCommand();
SQLiteDataReader reader = null;

command.Connection = connection;
command.CommandType = CommandType.Text;
command.CommandText = "select * from stuff";

try
{
    connection.Open();
    reader = command.ExecuteReader();  //<-- CODE APPEARS TO BREAK OUT OF EXECUTION

    while (reader.Read())
    {
        // Do stuff...
    }

    // Close/Dispose of Connection
}
catch (Exception ex)
{
    // Log error...
    // Close/Dispose of Connection
}

就像我说的,当 command.ExecuteReader() 被执行或当我正在执行 adapter.Fill() 时,代码只是停止执行......程序仍在运行,只是不再执行代码,所以读者。永远不会到达 Read()。

【问题讨论】:

  • 如果你删除 try/catch 会发生什么情况?
  • 您能否在一个简短但完整的控制台应用程序中重现该行为,还是依赖于您应用程序的其他方面?
  • 超快回复的人,非常感谢。我之前没有提到这一点,但是是的,上面的代码运行在一个简单的、什么都不做的控制台应用程序中——我正在执行的就是那段代码。 Rene,我把它放在 try/catch 中,看看是否有异常被抛出,但没有被捕获。删除 try/catch 会产生相同的行为 - 它会碰到提到的行,然后就像到达代码的末尾一样。它可能与许可有关吗?我正在尝试阅读 Chrome 浏览器历史记录。实际的 SELECT 是: select * from urls order by last_visit_time desc

标签: c# .net sqlite connection command


【解决方案1】:

试试这个
管道里可能有坏东西把事情搞砸

finally () 
{
   command.Cancel(); // !!!
   reader.Dispose();
}

Reader 非常高效,因为它一次会获取一个数据块。
所以可能发生的情况是,数据库可能会在您甚至没有实际读取的行上引发错误。
不是说这就是这里发生的事情,但可能是。
按 asc 然后 desc 设置顺序,看看是否会改变东西。
并带有(nolock)。

【讨论】:

  • 感谢您的回复,布拉姆。我添加了一个“finally”,但它从未进入 command.Cancel()。
  • 尝试一下。如果这不起作用,我将删除我的答案。
  • Blam,我不知道这是否是这里的实际修复 - 但它导致我让我的代码运行的时间比以前更长。我以为代码刚刚退出,但事实并非如此。它在那儿坐了好一会儿,最后才给我回了一条消息,表明数据库已被锁定。很抱歉我之前没有这样做......现在我只需要研究它为什么被锁定。
  • 我会捕获特定于数据库的异常,因为它通常会有更多详细信息。不了解 SQLLite,但在 SQL 中有一个 with (nolock)。在生产中使用 (nolock) 可能是不可接受的,但如果可以修复它,则表示锁定。
【解决方案2】:

我最近遇到了这个问题,但我没有看到任何东西能够解决它。 如上所述,我有,

while
(reader.read) do some stuff

每次我尝试运行它时它都会爆发,没有错误。

最终我设置了一个 boolean = reader.read 来查看值是什么。这是真的。那么为什么不读书呢?只是为了大声笑,我将 while 条件设置为:

dim b as boolean = reader.read
while (b) do some stuff

然后就可以了。所以看来我必须设置 reader.read 的值,然后引用它。完成某些操作后,B 被设置为 false。

这似乎是不应该做的事情,但它确实有效....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-09
    • 2019-06-10
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多