更新sqlite db中的记录时的MethodAccessException

时间:2011-05-10 10:12:44

标签: sqlite windows-phone-7

当我尝试使用以下语句更新记录时遇到此异常。

UPDATE GroupTable SET groupId=100 WHERE groupId=101

我测试了Firefox插件的SQLite Manager下的声明,它可以工作。 错误消息如下图所示。它在名为os_win_c.cs的{​​{1}}崩溃。 enter image description here

1 个答案:

答案 0 :(得分:3)

好吧,我修改了原始代码并修复了这个错误。

Path.GetTempPath()无效,因为沙箱环境。它没有访问权限。 我通过以下代码修复。它现在有效。

static int getTempname(int nBuf, StringBuilder zBuf)
{
      const string zChars = "abcdefghijklmnopqrstuvwxyz0123456789";
      StringBuilder zRandom = new StringBuilder(20);
      i64 iRandom = 0;
      for (int i = 0; i < 20; i++)
      {
        sqlite3_randomness(1, ref iRandom);
        zRandom.Append((char)zChars[(int)(iRandom % (zChars.Length - 1))]);
      }

      //! Modified by Toro, 2011,05,10
      string tmpDir = "tmpDir";
      IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication();
      store.CreateDirectory(tmpDir);
      //zBuf.Append(Path.GetTempPath() + SQLITE_TEMP_FILE_PREFIX + zRandom.ToString());
      zBuf.Append(tmpDir + "/" + SQLITE_TEMP_FILE_PREFIX + zRandom.ToString());

      return SQLITE_OK;
}

上述补丁会在Isolatedstorage中产生额外的文件夹tmpDir,临时文件不会自动删除,因此需要自行删除。我尝试在tmpDir winClose内的os_win_c.cs方法中删除这些文件,我发现在VACUUM时会导致崩溃。最后,我在关闭数据库时删除了那些tmp文件。以下是SQLiteConnection类中的Dispose方法。

public void Dispose()
{
    if (_open)
    {
         // Original codes for close sqlite database
         Sqlite3.sqlite3_close(_db);
         _db = null;
         _open = false;

         // Clear tmp files in tmpDir, added by Toro 2011,05,13
        IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication();
        string tmpDir = "tmpDir";
        if (store.DirectoryExists(tmpDir) == false) return;

        string searchPath = System.IO.Path.Combine(tmpDir, "*.*");
        foreach (string file in store.GetFileNames(searchPath)) {
            store.DeleteFile(System.IO.Path.Combine(tmpDir, file));
        }
    }
}