【问题标题】:SQLite CE exception - Database is lockedSQLite CE 异常 - 数据库被锁定
【发布时间】:2012-09-22 09:48:31
【问题描述】:

以下代码有问题。该程序似乎有时会在行中卡住 5-20 秒(显然没有模式......通常在第二个查询中,因为包含此代码的表单运行但并非总是如此)

Dim rdr As SQLiteDataReader = cmd.ExecuteReader

如果代码在表单启动后没有卡在第二个查询中,它就永远不会卡住。如果我关闭并重新打开表单,我有 50-60% 的机会在第二次查询中出现相同的错误。

然后它总是从这一点重新启动,有时没有错误...只是 5-20 秒的大延迟,有时在行出现错误“数据库文件已锁定,数据库已锁定”

cmd.ExecuteNonQuery() (2°时间..不在if块内)

此错误将禁止用户保存其更改,有时还会损坏数据记录,当然,还会引入我无法接受的巨大延迟:(

知道我做错了什么吗?

我正在使用 Visual Studio 2008 为具有 3.5 框架的 Windows CE 6.0 设备和

ADO.NET 2.0/3.5 SQLite 数据提供程序 版本 1.0.66.0 2010 年 4 月 18 日 使用 SQLite 3.6.23.1 http://sqlite.phxsoftware.com/

谢谢

'Update current program on database
Public Sub AggiornaUserOnDatabase(ByVal name As String, ByVal password As String, ByVal permission As String)
    'No spaces
    name = Trim(name)
    'Database var
    Dim ConString As String = "Data Source = " + DatabaseAccountPath + ";"
    Dim con As New SQLiteConnection
    Dim cmd As SQLiteCommand
    'Read from database
    Try
        con.ConnectionString = ConString
        con.Open()
        'Check if row is existing
        cmd = con.CreateCommand
        cmd.CommandText = "SELECT " + DBACCNAME + " FROM " + DatabaseAccountTableName + " WHERE " + DBACCNAME + " = '" + name + "'"
        Dim rdr As SQLiteDataReader = cmd.ExecuteReader
        'If empty...create the record
        If Not rdr.Read Then
            cmd = con.CreateCommand
            cmd.CommandText = "INSERT INTO " + DatabaseAccountTableName + " (" + DBACCNAME + ") VALUES ('" + name + "')"
            cmd.ExecuteNonQuery()
        End If
        rdr.close()
        'Update the values
        cmd = con.CreateCommand
        cmd.CommandText = "UPDATE " + DatabaseAccountTableName + " SET " _
                        + DBACCPASSWORD + " = '" + password + "', " _
                        + DBACCPERMISSION + " = '" + permission + "' " _
                        + "WHERE " + DBACCNAME + " = '" + name + "'"
        cmd.ExecuteNonQuery()
        cmd.Dispose()
        con.Close()
    Catch ex As Exception
        AggiungiRigaSuFile(ErroriPath, "Editing users account database: " + ex.Message, Configurazione.DiagnosticaOff, True)
    End Try
End Sub

【问题讨论】:

  • 可怕的问题陈述。 “似乎卡住了”。 “如果不在第二个查询中似乎永远不会卡住?!”这是什么意思?
  • 抱歉英语不好...我的意思是:第一次查询-> 确定第二次查询-> 60-70% 的时间如果我对第二次查询没有问题,因为使用此代码的表单开始我在以后的查询中不会有任何问题...我需要关闭表单并重新打开它并尝试在再次打开后进行第二次查询...非常令人困惑的数字和解释..希望你明白了
  • 更好的解释,但更新问题。不要指望人们阅读 cmets 以获得问题陈述。

标签: .net sqlite compact-framework windows-ce


【解决方案1】:

当它有一个打开的阅读器时,您正在使用 cmd。您需要在再次使用 cmd 之前关闭阅读器。甚至不要使用阅读器。执行 select count(*) 以查看记录是否存在。

cmd.CommandText = "SELECT count(*) FROM " + ...
int rowRet = (Int32)sqlCmd2.ExecuteScalar();

if (rowCount == 0)
{
    // do NOT create the command gain just use it
    cmd.CommandText = "INSERT INTO " + DatabaseAccountTableName ...
    // insert all the values here so the update is not required
    cmd.ExecuteNonQuery();
}
else if (rowCount == 1)
{
    cmd.CommandText = "UPDATE " + DatabaseAccountTableName + " SET " _
                    + DBACCPASSWORD + " = '" + password + "', " _
                    + DBACCPERMISSION + " = '" + permission + "' " _
                    + "WHERE " + DBACCNAME + " = '" + name + "'"
    cmd.ExecuteNonQuery();
}
else 
{
     // throw an error expected 0 or 1
}

【讨论】:

  • 你是什么意思?你能解释一下代码更改吗?我应该在下一个更新命令之前执行“rdr.close”吗?
  • 显示你的 rdr.close()。最好不要使用 rdr 。选择 count(*) 并在 count = 0 时插入。
  • 我想弄清楚如何在这段代码中使用 select count(*),你能展示一下吗?我在顶部代码中添加了 rdr.close ......我正在谷歌搜索,但找不到你所说的如何使用 count
  • 老兄,您仍然对插入命令有一个开放的阅读器!基本上,您在尝试写入的表上打开读取,并且想知道为什么会被锁定。
  • Blam,感谢您的澄清。这将解释为什么问题会卡在 IF 内的 ExecuteNonQuery 中……但是我的问题中总是跳过该块,因为记录已经存在……我对下一个 ExecuteNonQuery 语句有问题。无论如何,谢谢,因为当代码将在该 if 中运行时,我将修复我的其他代码。
猜你喜欢
  • 1970-01-01
  • 2013-07-09
  • 1970-01-01
  • 2018-07-13
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-04
相关资源
最近更新 更多