C# “接收”;“数据库已锁定”;SQLite和C出错#

C# “接收”;“数据库已锁定”;SQLite和C出错#,c#,sqlite,C#,Sqlite,以下是我正在使用的代码: public bool save(string name, string type, string city, string org) { BLL.maxkey maxkey = new BLL.maxkey(); int maxid = maxkey.getMaxKey(1); { SQLiteConnection sqConnection = new SQLiteConnect

以下是我正在使用的代码:

    public bool save(string name, string type, string city, string org)
    {
        BLL.maxkey maxkey = new BLL.maxkey();
        int maxid = maxkey.getMaxKey(1);

        {
            SQLiteConnection sqConnection = new SQLiteConnection(@"Data Source= C:\Users\BigDaddyDuergar\Documents\Visual Studio 2012\Projects\MET Character Manager\MET Character Manager\METCMDB");
            sqConnection.Open();

            SQLiteCommand cmd = new SQLiteCommand();
            cmd.Connection = sqConnection;
            SQLiteTransaction trans;

            trans = sqConnection.BeginTransaction();
            cmd.Transaction = trans;
            int rows = 0;

            try
            {
                cmd.CommandText = "insert into game values(@gameid, @gamename, @gametype, @gamecity, @gameorg)";
                cmd.Parameters.AddWithValue("@gameid", maxid);
                cmd.Parameters.AddWithValue("@gamename", name);
                cmd.Parameters.AddWithValue("@gametype", type);
                cmd.Parameters.AddWithValue("@gamecity", city);
                cmd.Parameters.AddWithValue("@gameorg", org);

                cmd.ExecuteNonQuery();
                trans.Commit();
            }
            catch (Exception ex)
            {
                trans.Rollback();
                error error = new error(ex);
            }
            finally
            {
                sqConnection.Close();
            }

            if (rows == 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }


    }
而且:

    public void updateMaxKey(int tablenum)
    {
        //using (var conn = new SQLiteConnection(@"Data Source= C:\Users\BigDaddyDuergar\Documents\Visual Studio 2012\Projects\MET Character Manager\MET Character Manager\METCMDB"))
        //using (var cmd = conn.CreateCommand())
        {
            SQLiteConnection sqConnection = new SQLiteConnection(@"Data Source= C:\Users\BigDaddyDuergar\Documents\Visual Studio 2012\Projects\MET Character Manager\MET Character Manager\METCMDB");
            sqConnection.Open();

            SQLiteCommand cmd = new SQLiteCommand();
            cmd.Connection = sqConnection;
            SQLiteTransaction trans;

            trans = sqConnection.BeginTransaction();
            cmd.Transaction = trans;

            try
            {

                cmd.CommandText = "update maxnumkey set maxnum = (maxnum + 1) where tableid = @tableid";
                cmd.Parameters.AddWithValue("@tableid", tablenum);
                cmd.ExecuteNonQuery();
                trans.Commit();
            }
            catch (Exception ex)
            {
                trans.Rollback();
                error error = new error(ex);
            }
            finally
            {
                sqConnection.Close();
            }
        }
    }

    public int returnMaxKey(int tablenum)
    {
        int maxrows = 0;

        {
            SQLiteConnection sqConnection = new SQLiteConnection(@"Data Source= C:\Users\BigDaddyDuergar\Documents\Visual Studio 2012\Projects\MET Character Manager\MET Character Manager\METCMDB");
            sqConnection.Open();

            SQLiteCommand cmd = new SQLiteCommand();
            cmd.Connection = sqConnection;
            SQLiteTransaction trans;

            trans = sqConnection.BeginTransaction();
            cmd.Transaction = trans;


            try
            {
                cmd.CommandText = "select maxnum from maxnumkey where tableid = @tableid";
                cmd.Parameters.AddWithValue("@tableid", tablenum);

                SQLiteDataReader sqReader = cmd.ExecuteReader();
                sqReader.Read();
                maxrows = sqReader.GetInt32(0);
                trans.Commit();


            }
            catch (Exception ex)
            {
                trans.Rollback();
                error error = new error(ex);
            }
            finally
            {
                sqConnection.Close();
            }

            if (maxrows > 0)
            {
                return maxrows;
            }
            else
            {
                return -1;
            }
        }


    }
我可以运行updatemaxkey函数,然后运行returnmaxkey函数,没有错误。我在数据库中验证更新是否正确处理,以及返回的信息是否匹配。我尝试进入SAVE函数,在trans.Commit()上,我得到一个“Database is locked”错误

我似乎在任何地方都找不到任何关于这一点的详细说明,也找不到任何关于如何缓解这一问题的方向

如果您需要任何进一步的澄清,请询问。我大约12小时前才开始使用sqlite,所以我希望它是我忽略的简单的东西

谢谢

Basic.NET:

  • 处置一次性物品。命令、连接就是这样

  • 使用“using”语句最容易做到这一点。杀死一半的代码

  • 这对于事务来说绝对至关重要

我只能打赌SqlConception——由于违反了基本的.NET原则,该原则要求您使用实现IDisposable的对象——在您重新打开文件共享时不会释放文件共享,这会阻塞数据库(无法很好地处理多个并行访问)


没有什么是特定于SqlCe的-您的C#代码违反了核心.NET原则。

好的,我使用的是using命令,但我不再使用了。我有点被这搞糊涂了。为了解决这个问题,我需要更改或查看什么?我更新了代码以使用下面建议的“using”命令,现在在使用块之后有了gc.collect(),但仍然存在问题。不确定如何获得db文件的发布。好的,我发现了我的问题。我打开阅读器开始读取数据,但从未关闭过。其他一切都很好。