套接字c#将数据发送到SQLite数据库,数据库已关闭

时间:2018-09-27 09:06:27

标签: c# sqlite

我有两个具有多个数据库的应用程序,一个简单的解释是:

  1. 主应用程序:从数据库(firebase或SQLServer)获取信息,并通过客户端套接字发送到第二个应用程序。
  2. Display App:在WinForm中显示数据后,获取套接字信息并插入SQLite数据库。

我的问题是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;
            }            
        }

也许错误来自于不参数化? 还是来自太多的操作?在这种情况下,我可以做些调试吗?

2 个答案:

答案 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
    }