我有两个具有多个数据库的应用程序,一个简单的解释是:
我的问题是Sqlite有时在执行插入操作时出错(数据库已锁定),因为我需要在短时间内进行多次插入操作。我在付款机上工作,如果机器收到0,5欧元,则必须迅速发送到显示器。
我使用MDSN Server,以及经过修改的代码:
if (content.IndexOf("<EOF>") > -1)
{
//This is amount to pay
string searchString = "<EOF>";
int endIndex = content.IndexOf(searchString);
s = content.Substring(0, endIndex);
string insertar = "INSERT INTO transacciones " +
"VALUES ('" + DateTime.Today + "','" + s + "',NULL);";
//Insert
SQLite bd = new SQLite();
bd.Insert(insertar);
Send(handler, content);
}
else if (content.IndexOf("<REC>") > -1)
{
//This is the pay
SQLite bd = new SQLite();
string searchString = "<REC>";
int endIndex = content.IndexOf(searchString);
s = content.Substring(0, endIndex);
int id = bd.GetId();
string insertar = "UPDATE transacciones " +
"SET cobrado= '" + s + "' WHERE ROWID=" + id + ";";
//Update
bd.Insert(insertar); //here i have the problem
Send(handler, content);
}
当我在支付机中插入很多硬币时,我的显示应用开始变慢并且接近第六次更新(有时或多或少)时,出现错误:
SQLite错误(5):数据库已锁定
函数插入为:
public Boolean Insert(string sql)
{
try
{
SQLiteConnection con = new SQLiteConnection("data source=" + Datos.dataBase + "\\bdDisplay.sqlite;Version=3;New=False;Compress=True;");
con.Open();
SQLiteCommand command = new SQLiteCommand(sql, con);
command.ExecuteNonQuery();
command.Dispose();
con.Close();
return true;
}
catch (SQLiteException ex)
{
MessageBox.Show("Error Insert: " + ex.Message);
return false;
}
}
也许错误来自于不参数化? 还是来自太多的操作?在这种情况下,我可以做些调试吗?
答案 0 :(得分:0)
收到错误后,您不会处理。
using (SQLiteConnection c =
new SQLiteConnection("data source=" + Datos.dataBase +
"\\bdDisplay.sqlite;Version=3;New=False;Compress=True;"))
{
c.Open();
using (SQLiteCommand cmd = new SQLiteCommand(sql, c))
{
var effect = cmd.ExecuteNonQuery();
return effect > 0;
}
}
对您来说是个大问题。也许您只需要最后一个区域。how to use finaly area
答案 1 :(得分:0)
是的,最好使用using(){}
,否则需要使用
try{
} catch(){
}
finally{
//to dispose
}
,如果您使用UnitOfWork样式,它将提高性能,例如在更新部分上Unite
可能会更好:
//This is the pay
SQLite bd = new SQLite();
string searchString = "<REC>";
int endIndex = content.IndexOf(searchString);
s = content.Substring(0, endIndex);
bd.Update(s);
....
public bool Update(object value)
{
using (var conn = new SQLiteConnection(...))
{
conn.Open();
// GetId().
//reconstruct sql command then
//do insert
}
// this way only use single conn for both getId and Insert
}