SQLite数据库在执行alter table query c#时被锁定

时间:2017-10-31 04:15:42

标签: c# .net winforms sqlite

以下函数用于我的应用程序的较新版本,需要将列添加到现有数据库。

Child2

执行此操作时会出现异常

  

数据库被锁定

堆栈跟踪

public void AddColumnIfNotexist()
    {
      try
      {
       using (SQLiteCommand cmd = _DBConnection.CreateCommand())
       {
         cmd.CommandText = string.Format("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'myTable'");
         bool hascol = false;
         using (SQLiteDataReader reader = cmd.ExecuteReader())
         {

           if (reader.Read())
           {
             //does column exists?
              hascol = reader.GetString(0).Contains(String.Format("\"{0}\"", "myNewColumn"));
             reader.Close();

            }
         }
               if (!hascol)
               {
                 StringBuilder sql = new StringBuilder(SQLMAXLENGTH);
                 sql.Append("ALTER TABLE Groups ADD COLUMN IsStayingRatio BIT NOT NULL DEFAULT 0");
                  cmd.CommandText = sql.ToString();
                  cmd.ExecuteNonQuery();


                  }
                    }
                }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message + "\r\n\r\n" + ex.StackTrace);
                LogApp.Write("Exception ex:" + ex.Message +"stacktrace "+ex.StackTrace, LogApp.Level.Error);

            }

        }
    }

但这并不总是发生。如果DB Fil的大小很大,就会发生这种情况。此外,从IDE调试时问题不存在。

Alter Table查询是否有任何限制? 任何人都可以发现导致数据库锁定的问题吗?

2 个答案:

答案 0 :(得分:1)

我建议开始新的gcloud config set project <projectID>

  

请注意,SQLITE_LOCKED错误与SQLITE_BUSY(5)不同。   SQLITE_BUSY表示另一个数据库连接(可能在   另一个进程)以阻止你的方式使用数据库   使用它。 SQLITE_LOCKED表示争用的来源是内部和   来自接收到的相同数据库连接   SQLITE_LOCKED错误。

     

有时候人们认为他们已经完成了SELECT语句,因为sqlite3_step()已经返回了SQLITE_DONE。但是,在调用sqlite3_reset()或sqlite3_finalize()之后,SELECT才真正完成

Error Code SQLITE_LOCKED (6): Database Is Locked

答案 1 :(得分:1)

reader.Close()为我工作后添加以下行。

GC.Collect();
GC.WaitForPendingFinalizers();

似乎在执行ALTER查询时未释放数据库。 得到here的提示。