检测阻止数据库问题

时间:2015-03-05 17:57:48

标签: c# sqlite compact-framework

我遇到database is locked database is locked Source: System.Data.SQLite

的困难

这里的事情是我在两个不同的应用程序中运行相同的方法,在一个应用程序中,方法很好,在另一个应用程序中,我得到了这个例外。 我知道我不能同时从两个或多个线程插入,所以我尝试在刚开始时调用方法进行测试,结果是一样的。

方法如下:

internal static void TransferTable()
        {
            String full_path = System.Reflection.Assembly.GetCallingAssembly().GetName().CodeBase;
            String directory_path = full_path.Substring(0, full_path.LastIndexOf("\\"));
            string pathDB = System.IO.Path.Combine(directory_path, "Data\\DB1.s3db");
            conString = @" Data Source = " + pathDB;

            using (SQLiteConnection con = new SQLiteConnection(conString))
            {
                con.Open();
                try
                {
                    using (SQLiteCommand cmd = con.CreateCommand())
                    {
                        cmd.CommandText = "ATTACH '" + pathDB + "' AS TOMERGE";

                        int retval = 0;
                        try
                        {
                            retval = cmd.ExecuteNonQuery();
                        }
                        catch (Exception ex) { Log.Fatal(ex.Message); }

                        string SQL = "INSERT OR REPLACE INTO Person SELECT * FROM TOMERGE.Person";

                        cmd.CommandText = SQL;
                        retval = 0;
                        try
                        {
                            retval = cmd.ExecuteNonQuery();
                        }
                        catch (Exception ex) { Log.Fatal(ex.Message); }
                    }
                }
                catch (Exception ex) { Log.Fatal(ex.Message); }
                finally { con.Close(); GC.Collect(); }
            }
        }

如何检测出问题所在?

1 个答案:

答案 0 :(得分:1)

通常,sqLite会自行处理文件锁定,共享和独占访问。

要控制哪个线程获得锁定,您可以使用BEGIN [TRANSACTION]并最终使用COMMIT(参见http://www.sqlite.org/lockingv3.html

或者你可以使用PRAGMA locking_mode = exclusive plus BEGIN EXCUSIVE / COMMIT。

然后检查访问数据库以锁定状态的进程/线程,并在一段时间后重试。