问题
I am getting a "cannot open" exception when I try to do multiple updates on the same table in the same transaction on SQLite in WinRT.
I have created a sample application for this use case. Below is code where on clicking the first button, I am creating a table in a transaction, and on clicking the other button, I am trying to update the same record a second time. There, it throws a "cannot open" exception.
app code:
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();
}
}
}
回答1:
You've probably stumbled across the same bug in sqlite-net that I have. I've created a fix which has already been pulled back into the main fork but there hasn't been a new release on NuGet since then. You could download the latest sources directly and check if it fixes your problem.
回答2:
Adding this code right after opening the database will solve the problem ( both when sideloaded as well when the app gets downloaded through store)
verifySQLResult(SQLite3.Execute(_db, "PRAGMA temp_store = memory;", 0, 0, 0));
source:
https://github.com/praeclarum/sqlite-net/issues/78
来源:https://stackoverflow.com/questions/13705341/multiple-update-statements-throw-cannot-open