MethodAccessException при обновлении записи в sqlite db - PullRequest
2 голосов
/ 10 мая 2011

Я сталкиваюсь с этим исключением, когда пытаюсь обновить запись с помощью следующего оператора.

UPDATE GroupTable SET groupId=100 WHERE groupId=101

Я протестировал оператор в SQLite Manager модуля Firefox, и он работает.Сообщение об ошибке выглядит следующим образом.Сбой в os_win_c.cs, метод с именем getTempname().enter image description here

1 Ответ

3 голосов
/ 10 мая 2011

Ну, я изменил исходные коды и исправил эту ошибку.

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

Приведенный выше патч приведет к созданию дополнительной папки tmpDir в изолированном хранилище, и временные файлы не будут удалены автоматически, поэтому его необходимо удалить самостоятельно.Я попытался удалить эти файлы в tmpDir методом winClose внутри os_win_c.cs, и обнаружил, что это приведет к сбою при выполнении VACUUM.Наконец, я удаляю эти файлы tmp при закрытии базы данных.Ниже приведен метод Dispose в SQLiteConnection классе.

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));
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...