2011-08-24 4 views
1

SQLite는 몇 가지 문제에 실행 한 데이터베이스 파일을 열 수 없습니다 Mac에서 시뮬레이터는, 다음과 같은 오류가 발생MonoTouch SQLite는 삽입 오류 나는 MonoTouch를 사용하고있어

<< 

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

FYI :

<< 

    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 

>> 

이것은 일반적으로 내부 스택 트레이스 이어진다 iDispatch은 내 프로그램의 이름입니다.

이제 여러 가지 방법을 사용하여 여러 테이블에 삽입 할지라도이 문제는 모든 메서드에서 임의로 발생합니다. 레코드가 삽입 된의

<< 

    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 용 윈도우 (ADO.NET SQLite는 2.0 데이터 공급자), 모노에서 실행되는 동일한 코드를 가지고 있고, 모노는 MonoTouch (버전 2.4.2에 ... 맥북 프로에서 실행, 출시 ID : 20402005, Git revision : b7eeb779e1134c204f22d9fd5b6ebec4d758f60d, 빌드 날짜 : 2011-04-22 22 : 48 : 43 + 0000) 이 오류가 표시 되나요?

도움이 될 것입니다.

은 BTW : 솔루션을 온라인으로 검색 한 후, 나는 다음과 같은 '지속 저널'명령을 추가하지만, 아무런 효과도 없었다 :

<< 
SqliteConnectionStringBuilder connectionStringBuilder = new SqliteConnectionStringBuilder(); 
connectionStringBuilder.JournalMode = SQLiteJournalModeEnum.Persist; 
connectionStringBuilder.DataSource = dbPath; 
SqliteConnection Connection = new SqliteConnection(connectionStringBuilder.ConnectionString); 
>> 

감사합니다!

+1

foreach 루프에 도달하기 전에 명령 개체의 Parameters 컬렉션에 매개 변수를 추가 한 다음 루프 내의 매개 변수 값을 할당 할 수 있습니다. 예 : 'command.Parameters.Add ("@ ID", SqlDbType.Int); '루프 외부; 그리고 루프 안에서 :'command.Parameters [ "@ ID"]. 값 = 고객 ID;'http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.addwithvalue.aspx – Tim

+0

foreach 절에서 새로 추가하기 전에 매개 변수를 지워야합니다.나는 당신이 매개 변수의 수의 한계를 쳤다고 생각한다 –

답변

1

설명에서 이것은 메모리 부족 상태 인 것처럼 보입니다. iOS 기기는 데스크톱 컴퓨터에 비해 메모리가 많지 않습니다. 너무 빨리 메모리를 소모하고 관리되지 않는 코드에서 충돌 할 수 있습니다. 예 : 디버거가 연결되지 않은 경우 다음 라인 (네이티브 코드에서) 만 SEGSIGV에 대한 타격을받을 것이다 :

* Assertion at ../../../../mono/mini/mini-exceptions.c:2188, condition `res != -1' not met 

이 당신의 객체 (는 IDisposable을 구현하는 모든 사람을) 폐기 시도 해결하려면, 하나 를 사용하거나 함께 을 배출하고 가능한 경우 재활용하십시오.

How can I recycle my SqliteCommand to speed up this Sqlite bulk insert (iOS)?을 나중에보십시오.

+0

고마워! 나는 당신이 링크 된 코드 (SqliteCommand를 재활용)에서 아이디어를보고 사용하여 다음과 같은 문제를 해결했습니다 : – Bob

+0

그것이 당신에게 효과적이었습니다 :-). 답을 수락하면 비슷한 문제로 검색 한 사람에게 답이 표시됩니다. 또한 http://bugzilla.xamarin.com/show_bug.cgi?id=339로 채워진 'Bob'과 똑같습니까? 그렇다면 고정 된 것으로 표시하고이 질문에 대한 링크를 추가하십시오. – poupou