C# SQLite数据库在执行alter table查询c时被锁定

C# SQLite数据库在执行alter table查询c时被锁定,c#,.net,winforms,sqlite,C#,.net,Winforms,Sqlite,以下函数用于更新版本的my app,该版本需要向现有数据库添加列 public void AddColumnIfNotexist() { try { using (SQLiteCommand cmd = _DBConnection.CreateCommand()) { cmd.CommandText = string.Format("SELECT sql FROM sqlite_master WHERE type =

以下函数用于更新版本的my app,该版本需要向现有数据库添加列

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

            }

        }
    }
当我执行此命令时,会得到一个异常

数据库已锁定

堆栈跟踪

at System.Data.SQLite.SQLite3.Step(SQLiteStatement stmt)
at System.Data.SQLite.SQLiteDataReader.NextResult()
at System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave)
at System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.SQLite.SQLiteCommand.ExecuteNonQuery(CommandBehavior behavior)
at System.Data.SQLite.SQLiteCommand.ExecuteNonQuery()
at DataPlus.DB.AddColumnIfNotexist() in D:\Projects\DB.cs:line 343
但这种情况并不总是发生。如果DB Fil的大小很大,就会发生这种情况。此外,从IDE进行调试时也不存在此问题

Alter Table查询有任何限制吗?
有人能找出导致数据库锁定的问题吗?

我建议启动一个新的SQLITE命令

请注意,SQLITE_锁定错误与SQLITE_BUSY 5不同。 SQLITE_BUSY表示另一个数据库连接可能在 另一个进程使用数据库的方式会阻止您 使用它。SQLITE_LOCKED表示争用源是内部和外部的 来自接收数据的同一数据库连接 SQLITE_锁定错误

有时人们认为他们已经完成了SELECT语句,因为sqlite3\u步骤返回了SQLITE\u DONE。但是,直到调用sqlite3_reset或sqlite3_finalize,选择才真正完成


在reader.Close之后添加以下行对我很有用

GC.Collect();
GC.WaitForPendingFinalizers();
似乎在执行ALTER查询时没有释放DB。
从他那里得到了暗示

我还没有检查错误代码。它返回5,但消息是数据库已锁定。此外,我还尝试使用不同的命令对象,甚至尝试断开用于select查询的连接,并为Alter创建单独的连接。所有这些都给出了相同的结果。其他进程不可能访问数据库,因为它仅由我的应用程序处理。您正在调用reader。仅当找到列时才关闭。为什么?不,如果reader.Read返回true,它会调用,对吗?这意味着它找到的是表而不是列,对吗?对不起,你是对的。但是为什么要调用reader.Close(仅在找到表时关闭)?无论如何,DB被锁定,因为其他连接具有活动事务。但是为什么要调用reader.Close(仅在找到表时关闭)?答:目的是找到该表中的列。一旦找到表,它将检查中的列。存在表不在其中的应用程序版本。DB被锁定,因为其他一些连接有一个活动事务A:但这里我使用的是同一个连接对象。在使用这些对象进行SELECT和ALTER查询时是否存在任何问题。