SQLite3.dll проблемы x64 - PullRequest
       1

SQLite3.dll проблемы x64

0 голосов
/ 26 июля 2011

Я решил свою проблему в SQLite sqlite3_column_origin_name function с простым обходным путем, но теперь у меня есть еще одна большая проблема.

У меня есть 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" существует.

Могу ли я решить мою проблему?

РЕДАКТИРОВАТЬ: я загружаю файл sqlite3.dll из http://sourceforge.net/projects/sqlite-dotnet2/files/SQLite%20for%20ADO.NET%202.0/1.0.66.0/

Файл находится в / bin / x64, и я переименовал его в sqlite3.dll

РЕДАКТИРОВАТЬ 2: Нажав на дополнительную информацию, я имею:

Файл с указанием всех проблем:
C: \ Users \ Utente \ AppData \ Local \ Temp \ WERB927.tmp.WERInternalMetadata.xml C: \ Users \ Utente \ AppData \ Local \ Temp \ WERD59D.tmp.appcompat.txt
C: \ Users \ Utente \ AppData \ Local \ Temp \ WERD5BD.tmp.mdmp

Конфиденциальность Leggere l'informativa sulla онлайн:
http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0410

Se l'informativa sulla конфиденциальность в Интернете, а не disponibile, leggere quella offline: C: \ Windows \ system32 \ it-IT \ erofflps.txt

1 Ответ

0 голосов
/ 22 января 2014

попробуйте следующий код

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