次のコードに問題があります。プログラムは、行で 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