0

次のコードに問題があります。プログラムは、行で 5 ~ 20 秒間、時々スタックするようです (明らかにパターンはありません...このコードを含むフォームが実行されるため、2 番目のクエリで頻繁に実行されるわけではありません)。

Dim rdr As SQLiteDataReader = cmd.ExecuteReader

フォームが開始されてから 2 番目のクエリでコードがスタックしていない場合、コードがスタックすることはありません。フォームを閉じて再度開くと、ほとんどの場合、2 番目のクエリで同じエラーが発生する可能性が 50 ~ 60% あります。

次に、この時点から常にエラーなしで再起動します... 5〜20秒の大きな遅延と、行に「データベースファイルがロックされています、データベースがロックされています」というエラーが表示されることがあります

cmd.ExecuteNonQuery() (2° 時間.. if ブロック内にありません)

このエラーにより、ユーザーは変更を保存できなくなり、データ レコードが破損することもあります。もちろん、受け入れられないほどの大きな遅延が発生します :(

私が間違っていることのアイデアはありますか?

私は、3.5 フレームワークを備えた Windows CE 6.0 デバイス用のビジュアル スタジオ 2008 を使用して開発しています。

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
4

1 に答える 1

2

リーダーが開いているときに 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
}
于 2012-09-22T12:46:17.730 に答える