2

WinRT の SQLite で同じトランザクション内の同じテーブルに対して複数の更新を実行しようとすると、「開くことができません」という例外が発生します。

このユース ケースのサンプル アプリケーションを作成しました。以下は、最初のボタンをクリックしてトランザクションでテーブルを作成し、他のボタンをクリックして同じレコードをもう一度更新しようとしているコードです。そこで、「開くことができません」という例外がスローされます。

アプリコード:

private SQLiteConnection getConnection()
{
    var connection = SQLiteConnectionPool.Shared.GetConnection(
                           new SQLiteConnectionString("sample.db", false));
    return connection;
}

private void Button_Click_1(object sender, RoutedEventArgs e)
{
    SQLiteConnection con = getConnection();
    con.BeginTransaction();
    {
        try
        {
            var command = new SQLiteCommand(con) {
                CommandText =
                    @"create table konysyncMETAINFO (
                        id bigint not null,
                        versionnumber int,
                        lastserversynccontext nvarchar(1000),
                        filtervalue nvarchar(1000),
                        replaysequencenumber integer,
                        lastgeneratedid integer,
                        scopename nvarchar(100),
                        primary key (id))"
            };
            var xyz = (double)command.ExecuteNonQuery();

            var command2 = new SQLiteCommand(con) {
                CommandText =
                    @"insert into konysyncMETAINFO
                        (id,scopename,versionnumber,lastserversynccontext,
                         replaysequencenumber,lastgeneratedid)
                      values ('1','testscope','0','','0','-1')"
            };
            var xyz2 = (double)command2.ExecuteNonQuery();

            var command3 = new SQLiteCommand(con) {
                CommandText =
                    @"insert into konysyncMETAINFO
                        (id,scopename,versionnumber,lastserversynccontext,
                         replaysequencenumber,lastgeneratedid)
                      values ('2','testscope2','0','','0','-1')"
            };
            var xyz3 = (double)command3.ExecuteNonQuery();
            con.Commit();
        }
        catch (Exception ex)
        {
            con.Rollback();
        }
    }
}

private void Button_Click_2(object sender, RoutedEventArgs e)
{
    SQLiteConnection con = getConnection();
    con.BeginTransaction();
    {
        try
        {
            var command = new SQLiteCommand(con) {
                CommandText =
                    @"Update konysyncMETAINFO
                      set lastgeneratedid='4'
                      WHERE scopename = 'testscope'"
            };
            var xyz = (double)command.ExecuteNonQuery();

            //var command2 = new SQLiteCommand(con) { CommandText = "insert into konysyncMETAINFO (id,scopename,versionnumber,lastserversynccontext,replaysequencenumber,lastgeneratedid) values ('3','testscope3','0','','0','-1')" };
            //var xyz2 = (double)command2.ExecuteNonQuery();

            var command3 = new SQLiteCommand(con) {
                CommandText =
                    @"Update konysyncMETAINFO 
                      set lastgeneratedid='3'
                      WHERE scopename = 'testscope'"
            };
            var xyz3 = (double)command3.ExecuteNonQuery();
            con.Commit();
        }
        catch (Exception ex)
        {
            con.Rollback();
        }
    }
}
4

2 に答える 2

3

おそらく、私が持っているのと同じsqlite-net のバグに出くわしたことでしょう。私は修正プログラムを作成しましたが、これは既にメイン フォークに戻されていますが、それ以降、 NuGet に新しいリリースはありません。最新のソースを直接ダウンロードして、問題が解決するかどうかを確認できます。

于 2012-12-04T17:29:52.680 に答える
0

データベースを開いた直後にこのコードを追加すると、問題が解決します (サイドロード時とアプリがストアからダウンロードされたときの両方)。

verifySQLResult(SQLite3.Execute(_db, "PRAGMA temp_store = memory;", 0, 0, 0));

ソース:

https://github.com/praeclarum/sqlite-net/issues/78

于 2014-01-25T06:13:01.580 に答える