最近、私はマイクロORMを閲覧していますが、シンプルなため、MassiveforSQLiteが好きです。しかし、私は今問題を抱えています。
selectステートメントの後にupdateステートメントを実行しているだけですが、例外が発生しています。以下は私のコードです:
var tbl = new Cust();
var customers = tbl.All(where: "CustomerID > @0", orderBy: "FirstName", columns: "CustomerID,FirstName", args: 4);
var firstCustomerName= customers.First().FirstName;
var c = tbl.Update(new { FirstName = "Updated2" }, 4); //Exception is here!
//Same happens even when using another object
//var tbl2 = new Cust();
//tbl2.Update(new { FirstName = "UpdatedName" }, 4);//Exception is here!
例外メッセージは次のとおりです:Massive.SQLiteソースの以下のメソッドで「データベースがロックされています」
public virtual int Execute(IEnumerable<DbCommand> commands)
{
var result = 0;
using (var conn = OpenConnection())
{
using (var tx = conn.BeginTransaction())
{
foreach (var cmd in commands)
{
cmd.Connection = conn;
cmd.Transaction = tx;
result += cmd.ExecuteNonQuery();
}
tx.Commit();//Here is the Exception!
}
}
return result;
}
Massive.SQLiteソースを見ると、上記のコードでわかるように、massiveは接続を閉じることはなく、代わりにusingステートメントを中継して接続オブジェクトを破棄していることがわかります。
上記のコードのOpenConnection()は、呼び出されるたびに新しい接続を返すメソッドです。
public virtual DbConnection OpenConnection()
{
var result = _factory.CreateConnection();
result.ConnectionString = ConnectionString;
result.Open();
return result;
}
Massiveが接続を閉じていない場合で、このSOの質問によると、 Sqliteは同時接続が得意ではなく、閉じることになっている場合、どうすれば閉じることができますか?-接続は私に公開されていません。
MassiveとSQLiteを使用している開発者からのベストプラクティスを聞きたいです。