[英]SQLite Error 14: 'unable to open database file' if in root folder
[英]MonoTouch SQLite Insert Error - Unable to open the database file
我正在使用MonoTouch,並且遇到了SQLite的一些問題:
在Mac上使用iPad模擬器將數百(有時是數千)次插入Sqlite數據庫后,會發生以下錯誤:
<<
Mono.Data.Sqlite.SqliteException: Unable to open the database file
at Mono.Data.Sqlite.SQLite3.Reset (Mono.Data.Sqlite.SqliteStatement stmt)
[0x0008a] in /Developer/MonoTouch/Source/mono/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLite3.cs:226
at Mono.Data.Sqlite.SQLite3.Step (Mono.Data.Sqlite.SqliteStatement stmt)
[0x00046] in /Developer/MonoTouch/Source/mono/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLite3.cs:168
at Mono.Data.Sqlite.SqliteDataReader.NextResult () [0x00129] in
/Developer/MonoTouch/Source/mono/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLiteDataReader.cs:908
at Mono.Data.Sqlite.SqliteDataReader..ctor (Mono.Data.Sqlite.SqliteCommand
cmd, CommandBehavior behave) [0x00051] in /Developer/MonoTouch/Source/mono/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLiteDataReader.cs:89
at (wrapper remoting-invoke-with-check) Mono.Data.Sqlite.SqliteDataReader:.ctor (Mono.Data.Sqlite.SqliteCommand,System.Data.CommandBehavior)
at Mono.Data.Sqlite.SqliteCommand.ExecuteReader (CommandBehavior behavior) [0x00006] in
/Developer/MonoTouch/Source/mono/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLiteCommand.cs:539
at Mono.Data.Sqlite.SqliteCommand.ExecuteNonQuery () [0x00000] in
/Developer/MonoTouch/Source/mono/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLiteCommand.cs:568
at iDispatch.DevVehicle.Insert () [0x0003f] in
/Users/Projects/iDispatch/iDispatch/DevVehicleDAL.cs:240
>>
這通常是內部堆棧跟蹤:
<<
Stacktrace:
at (wrapper managed-to-native) Mono.Data.Sqlite.UnsafeNativeMethods.sqlite3_prepare (intptr,intptr,int,intptr&,intptr&) <IL 0x0002a, 0xffffffff>
at Mono.Data.Sqlite.SQLite3.Prepare (Mono.Data.Sqlite.SqliteConnection,string,Mono.Data.Sqlite.SqliteStatement,uint,string&) [0x00044] in
/Developer/MonoTouch/Source/mono/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLite3.cs:258
at Mono.Data.Sqlite.SqliteCommand.BuildNextCommand () [0x00019] in /Developer/MonoTouch/Source/mono/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLiteCommand.cs:230
at Mono.Data.Sqlite.SqliteCommand.GetStatement (int) [0x0000b] in /Developer/MonoTouch/Source/mono/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLiteCommand.cs:264
at (wrapper remoting-invoke-with-check) Mono.Data.Sqlite.SqliteCommand.GetStatement (int) <IL 0x00039, 0xffffffff>
at Mono.Data.Sqlite.SqliteDataReader.NextResult () [0x000cc] in
/Developer/MonoTouch/Source/mono/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLiteDataReader.cs:891
at Mono.Data.Sqlite.SqliteDataReader..ctor
(Mono.Data.Sqlite.SqliteCommand,System.Data.CommandBehavior) [0x00051] in /Developer/MonoTouch/Source/mono/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLiteDataReader.cs:89
at (wrapper remoting-invoke-with-check) Mono.Data.Sqlite.SqliteDataReader..ctor (Mono.Data.Sqlite.SqliteCommand,System.Data.CommandBehavior) <IL 0x00021, 0xffffffff>
at Mono.Data.Sqlite.SqliteCommand.ExecuteReader (System.Data.CommandBehavior)
[0x00006] in /Developer/MonoTouch/Source/mono/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLiteCommand.cs:539
at Mono.Data.Sqlite.SqliteCommand.ExecuteNonQuery () [0x00000] in /Developer/MonoTouch/Source/mono/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLiteCommand.cs:568
at iDispatch.DevVehicle.Insert () [0x0003f] in /Users/Projects/iDispatch/iDispatch/DevVehicleDAL.cs:240
at iDispatch.ThreadSQL.DoWorkSQL () [0x0038a] in /Users/Projects/iDispatch/iDispatch/ThreadSQL.cs:140
at System.Threading.Thread.StartUnsafe () [0x00016] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System.Threading/Thread.cs:684
at (wrapper runtime-invoke) object.runtime_invoke_void__this__ (object,intptr,intptr,intptr) <IL 0x0004e, 0xffffffff>
Native stacktrace:
0 iDispatch 0x000d0db5 mono_handle_native_sigsegv + 343
1 iDispatch 0x0000f80c mono_sigsegv_signal_handler + 322
2 libSystem.B.dylib 0x9833705b _sigtramp + 43
3 ??? 0xffffffff 0x0 + 4294967295
4 libsqlite3.dylib 0x03645dc1 sqlite3DbStrNDup + 33
5 libsqlite3.dylib 0x03645e07 sqlite3NameFromToken + 23
6 libsqlite3.dylib 0x036486dc sqlite3IdListAppend + 92
7 libsqlite3.dylib 0x03682720 sqlite3Parser + 11904
8 libsqlite3.dylib 0x03684536 sqlite3RunParser + 310
9 libsqlite3.dylib 0x03684b34 sqlite3Prepare + 276
10 libsqlite3.dylib 0x03684fa7 sqlite3LockAndPrepare + 151
11 ??? 0x10c309ff 0x0 + 281217535
12 ??? 0x10c2fd1c 0x0 + 281214236
13 ??? 0x10c2f857 0x0 + 281213015
14 ??? 0x10c2f58a 0x0 + 281212298
15 ??? 0x10c2f50a 0x0 + 281212170
16 ??? 0x10c2eeea 0x0 + 281210602
17 ??? 0x10c2ea3c 0x0 + 281209404
18 ??? 0x10c2e8d6 0x0 + 281209046
19 ??? 0x10c2cc9e 0x0 + 281201822
20 ??? 0x10c2cb30 0x0 + 281201456
21 ??? 0x10fde444 0x0 + 285074500
22 ??? 0x10bb6786 0x0 + 280717190
23 ??? 0x106f2cba 0x0 + 275721402
24 ??? 0x077cfbf0 0x0 + 125631472
25 iDispatch 0x0000f5c7 mono_jit_runtime_invoke + 1332
26 iDispatch 0x001ed281 mono_runtime_invoke + 137
27 iDispatch 0x001ee8d1 mono_runtime_delegate_invoke + 111
28 iDispatch 0x00229c74 start_wrapper_internal + 692
29 iDispatch 0x00229cc2 start_wrapper + 17
30 iDispatch 0x00266b99 thread_start_routine + 191
31 iDispatch 0x002974f1 GC_start_routine + 107
32 libSystem.B.dylib 0x982fe259 _pthread_start + 345
33 libSystem.B.dylib 0x982fe0de thread_start + 34
* Assertion at ../../../../mono/mini/mini-exceptions.c:2188, condition `res != -1' not met
>>
僅供參考: iDispatch是我的程序的名稱。
現在,盡管我要使用多種方法插入多個表中,但是在所有方法中都會隨機出現問題。 通常,insert方法如下所示:
<<
public void BulkInsert(StandardEquipmentCollection sec)
{
try
{
Connection.Open();
SQLiteCommand cmd = Connection.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText =
"INSERT INTO StandardEquipment (" + "Category, Description, VehicleID" +
") VALUES (" + "@Category, @Description, @VehicleID)";
foreach (StandardEquipment se in sec)
{
cmd.Parameters.AddWithValue("@Category", se.Category);
cmd.Parameters.AddWithValue("@Description", se.Description);
cmd.Parameters.AddWithValue("@VehicleID", se.VehicleID);
cmd.ExecuteNonQuery();
}
Connection.Close();
}
catch (Exception ex)
{
threadSQL.AddOutQ("Error: StandardEquipment BulkInsert - " + ex);
}
}
>>
在插入了100個(有時是1000個)記錄后,就會出現此問題。
那些可以插入到表中的文件看起來很好(我使用Navicat Lite),而那些出現錯誤的文件看起來也很好(即從調試器中我可以看到所有數據都是正確的,格式也一樣)。
我在Windows上運行完全相同的代碼(SQLite的ADO.NET 2.0數據提供程序),在Windows上運行的Mono和在MacBook Pro上運行的Mono ...僅在MonoTouch上運行(版本2.4.2;發行ID:20402005; Git版本:b7eeb779e1134c204f22d9fd5b6ebec4d758f60d;建立日期:2011-04-22 22:48:43 + 0000)我是否看到此錯誤。
任何幫助將不勝感激!
順便說一句:在網上搜索解決方案后,我添加了以下“ Persist Journal”命令,但沒有效果:
<<
SqliteConnectionStringBuilder connectionStringBuilder = new SqliteConnectionStringBuilder ();
connectionStringBuilder.JournalMode = SQLiteJournalModeEnum.Persist;
connectionStringBuilder.DataSource = dbPath;
SqliteConnection Connection = new SqliteConnection(connectionStringBuilder.ConnectionString);
>>
謝謝!
根據您的描述,這看起來像是內存不足的情況。 請記住,與台式計算機相比,iOS設備沒有太多的內存。 您可能耗盡內存的速度太快,並在非托管代碼內崩潰。 例如,當未附加調試器時,僅對於SEGSIGV(來自本機代碼),以下行將被選中:
* Assertion at ../../../../mono/mini/mini-exceptions.c:2188, condition `res != -1' not met
要解決此問題,請嘗試使用或調用Dispose處理對象(所有實現IDisposable的對象),並在可能的情況下回收它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.