Socket c # отправляет данные в базу данных SQLite, база данных закрыта - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть два приложения с несколькими базами данных, простое объяснение:

  1. Основное приложение: получить информацию из базы данных (firebase или SQLServer) и отправить через сокет клиента во второе приложение.
  2. Показать приложение: получить информацию о сокете и вставить в базу данных SQLite, после того, как покажет данные в WinForm.

Моя проблема иногда Sqlite имеет ошибку при вставке (База данных заблокирована), потому что мне нужно много вставок за короткое время.Я работаю в автомате выплат, и если машина получает 0,5 €, мне нужно быстро отправить на дисплей.

Я использую Сервер MDSN , и этот модифицированный код:

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 голосов
/ 27 сентября 2018

Да, лучше использовать 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
    }
0 голосов
/ 27 сентября 2018

вы не утилизируете при получении ошибки.

 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;
            }

        }

для вас большая проблема.возможно, вам нужна только конечная область. как использовать конечную область

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...