2011-07-26 68 views
0

我用一个简单的解决方法解决了我的问题SQLite sqlite3_column_origin_name function,但现在我又遇到了另一个大问题。SQLite3.dll问题x64

我已经与这些进口sqlwrapper:

[DllImport("sqlite3.dll", EntryPoint = "sqlite3_column_int")] 
    static extern int sqlite3_column_int(IntPtr stmHandle, int iCol); 

    [DllImport("sqlite3.dll", EntryPoint = "sqlite3_column_text")] 
    static extern string sqlite3_column_text(IntPtr stmHandle, int iCol); 

    [DllImport("sqlite3.dll", EntryPoint = "sqlite3_column_double")] 
    static extern double sqlite3_column_double(IntPtr stmHandle, int iCol); 

,这是我的executeQuery功能:

public DataTable ExecuteQuery(String query) 
    { 

     SQLiteWrapper.query = query; 

     if (!_open) 
      throw new SQLiteException("SQLite database is not open."); 

     //prepare the statement 
     IntPtr stmHandle = IntPtr.Zero; 
     try 
     { 
      stmHandle = Prepare(query); 
     } 
     catch(Exception e) 
     { 
      Log.e(e.Message); 
      return null; 
     } 


     // Prevensione sul out of memory 
     if(stmHandle == IntPtr.Zero) 
     { 
      return null; 
     } 

     //get the number of returned columns 
     int columnCount = sqlite3_column_count(stmHandle); 

     DataTable dTable = null; 
     try 
     { 
      //create datatable and columns 
      dTable = new DataTable(); 
      for (int i = 0; i < columnCount; i++) 
      { 
       try 
       { 
        ArrayList selections = Utils.getQuerySelection(query); 
        foreach(String s in selections) 
        { 
         dTable.Columns.Add(s); 
        } 
        //Workaround for sqlite3_column_origin_name 

        //dTable.Columns.Add("_id"); 
        //dTable.Columns.Add(sqlite3_column_origin_name(stmHandle, i)); 
       } 
       catch(Exception e) 
       { 

       } 
      } 

      //populate datatable 
      while (sqlite3_step(stmHandle) == SQLITE_ROW) 
      { 
       object[] row = new object[columnCount]; 
       for (int i = 0; i < columnCount; i++) 
       { 
        switch (sqlite3_column_type(stmHandle, i)) 
        { 

         case SQLITE_INTEGER: 
          // WORKS CORRECTLY!!!! 
          row[i] = sqlite3_column_int(stmHandle, i); 
          break; 
         case SQLITE_TEXT: 
          // ERROR!!!!!!!!!!!!!!!!!!!!!! 
          row[i] = sqlite3_column_text(stmHandle, i); 
          break; 
         case SQLITE_FLOAT: 
          row[i] = sqlite3_column_double(stmHandle, i); 
          break; 
        } 
       } 
       dTable.Rows.Add(row); 
      } 
     } 
     catch(AccessViolationException ave) 
     { 
      Log.e("SqliteWrapper - AccessViolationException - " + ave.Message + ":" + query); 
      return null; 
     } 

     // Se ci sono stati errori allora torna null e ritenta la query 
     Boolean finalized = Finalize(stmHandle); 
     if(!finalized) 
     { 
      return null; 
     } 
     return dTable; 
    } 

当我调用sqlite3_column_text(......)我的应用程序崩溃。 我已经探索了dll文件中的函数,并且存在这个入口点“sqlite3_column_text”。

我可以解决我的问题吗?

编辑:我从http://sourceforge.net/projects/sqlite-dotnet2/files/SQLite%20for%20ADO.NET%202.0/1.0.66.0/

文件下载我sqlite3.dll文件是/斌/ 64位之内,我已重新命名为sqlite3.dll

编辑2:点击更多的信息,我有:

文件澈contribuiscono阿拉descrizione德尔problema:
C:\用户\ Utente \应用程序数据\本地的\ Temp \ WERB927.tmp.WERInternalMetadata.xml C:\用户\ Utente \应用程序数据\本地的\ Temp \ WERD59D.tmp.appcompat.txt
C:\用户\ Utente \应用程序数据\本地的\ Temp \ WERD5BD.tmp.mdmp

Leggere L'informativa苏拉在线隐私:
http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0410

硒L'informativa苏拉在线隐私不èdisponibile, leggere 克亚离线:C:\ WINDOWS \ SYSTEM32 \ IT-IT \ erofflps.txt

+0

“我能解决我的问题?”也许。第一步是告诉我们一些比“我的应用崩溃”更丰富的信息。 –

+0

你是对的。但我没有任何错误,正如http://stackoverflow.com/questions/6759198/sqlite-sqlite3-column-origin-name-function – CeccoCQ

+0

如果列为空可能会返回一个空例外,检查出 – V4Vendetta

回答

0

试试下面的代码

[DllImport("sqlite3.dll", EntryPoint = "sqlite3_column_text")] 
    static extern string sqlite3_column_text(IntPtr stmHandle, int iCol); 

串→IntPtr的

[DllImport("sqlite3.dll", EntryPoint = "sqlite3_column_text")] 
static extern IntPtr sqlite3_column_origin_name(IntPtr stmHandle, int iCol); 

row[i] = Marshal.PtrToStringAnsi(sqlite3_column_text(stmHandle, i));