当我尝试使用以下语句更新记录时遇到此异常。
UPDATE GroupTable SET groupId=100 WHERE groupId=101
我测试了Firefox插件的SQLite Manager下的声明,它可以工作。
错误消息如下图所示。它在名为os_win_c.cs
的{{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));
}
}
}