Hi, I'm (fairly) new to C++ and also to using dlls and SQLite etc. etc.
Ok, so I have a class which represents my database connection. When the open() method is called, it should open the SQLite database. This works. Next, I wnt to use the PRAGMA user_version command to see if the database version matches the app version. (If not, then I intend to prompt the user and offer to upgrade...) So far so good, however when I try to actually do it, the file opens ok (and I can close it), however when the prepare function is called, I get a GPF. This happens with both the prepare and the prepare_V2 functions. I know it is that line, because if I comment it out....! pologies for the poor coding (I'm learning!) but could anyone tell me what I'm doing wrong, please? Many thanks -- Paul Code:- dbConnection.h #include "sqlite3.h" typedef int (*SQLCALLBACK)(void *,int,char **,char **); typedef int (*SQLOPEN)(const char *,sqlite3 **); typedef int (*SQLPREPARE)(sqlite3 *db,const char *zSql,int nBytes,sqlite3_stmt **ppStmt,const char **pzTail); typedef int (*SQLSTEP)(sqlite3_stmt **ppStmt); typedef int (*SQLFINALIZE)(sqlite3_stmt **ppStmt); typedef char *(*SQLERRMSG)(sqlite3 *); typedef void (*SQLCLOSE)(sqlite3 *); class dbConnection{ public: dbConnection(); bool isValid(); bool isInit(); bool openFile(); bool open(wxString filename); bool closeFile(); wxString getFileName(); int versionCallback(void *NotUsed, int argc, char **argv, char **azColName); private: SQLOPEN sqlOpenAdd; SQLPREPARE sqlPrepareAdd; SQLSTEP sqlStepAdd; SQLFINALIZE sqlFinalizeAdd; SQLERRMSG sqlErrMsgAdd; SQLCLOSE sqlCloseAdd; sqlite3 *db; HINSTANCE hinstLib; bool initialized; bool dbValid; wxString path; }; dbConnection.cpp #include <stdio.h> #include "markbookplus.h" #include "dbconnection.h" dbConnection::dbConnection(){ db = NULL; initialized = false; dbValid = false; hinstLib = LoadLibrary(TEXT("sqlite3.dll")); if (hinstLib != NULL) { sqlOpenAdd = (SQLOPEN) GetProcAddress(hinstLib, TEXT("sqlite3_open")); initialized = (sqlOpenAdd != NULL); sqlPrepareAdd = (SQLPREPARE) GetProcAddress(hinstLib, TEXT("sqlite3_prepare")); initialized &= (sqlPrepareAdd != NULL); sqlStepAdd = (SQLSTEP) GetProcAddress(hinstLib, TEXT("sqlite3_step")); initialized &= (sqlStepAdd != NULL); sqlFinalizeAdd = (SQLFINALIZE) GetProcAddress(hinstLib, TEXT("sqlite3_finalize")); initialized &= (sqlFinalizeAdd != NULL); sqlErrMsgAdd = (SQLERRMSG) GetProcAddress(hinstLib, TEXT("sqlite3_errmsg")); initialized &= (sqlErrMsgAdd != NULL); sqlCloseAdd = (SQLCLOSE) GetProcAddress(hinstLib, TEXT("sqlite3_close")); initialized &= (sqlCloseAdd != NULL); } } bool dbConnection::isInit(){ return initialized; } bool dbConnection::isValid(){ return dbValid; } bool dbConnection::openFile(){ wxFileDialog dialog(NULL, wxT("Choose MarkbookPlus Data file"), wxEmptyString, wxEmptyString, wxT("MarkBookPlus Data Files (*.mbd)|*.mbd"), wxOPEN); if (dialog.ShowModal() == wxID_OK){ closeFile(); path = dialog.GetPath(); return open(path); } return false; } bool dbConnection::open(wxString filename){ // char *zErrMsg = 0; int rc; sqlite3 *newdb = NULL; sqlite3_stmt **ppStmt; const char **pzTail; rc = (sqlOpenAdd) (filename.c_str(),&newdb); if(rc != SQLITE_OK){ wxString msg; msg.Printf(wxT("Can't open database: %s"),(sqlErrMsgAdd)(newdb)); wxMessageBox(msg, wxT("File Open Failure"), wxOK | wxICON_ERROR, NULL); return false; } wxString getDBVersion = "PRAGMA user_version"; rc = (sqlPrepareAdd)(newdb, getDBVersion.c_str(),getDBVersion.length(),ppStmt,pzTail); if(rc != SQLITE_OK){ wxString msg; msg.Printf(wxT("Can't process database: %s"),(sqlErrMsgAdd)(newdb)); wxMessageBox(msg, wxT("File Open Failure"), wxOK | wxICON_ERROR, NULL); return false; } // rc = (sqlStepAdd)(ppStmt); // if(rc == SQLITE_ROW){ // }else{ // wxString msg; // msg.Printf(wxT("Can't process database: %s"),(sqlErrMsgAdd)(newdb)); // wxMessageBox(msg, wxT("File Open Failure"), // wxOK | wxICON_ERROR, NULL); // return false; // } rc = (sqlFinalizeAdd)(ppStmt); if(rc != SQLITE_OK){ wxString msg; msg.Printf(wxT("Unable to release database statement: %s"),(sqlErrMsgAdd)(newdb)); wxMessageBox(msg, wxT("File Open Failure"), wxOK | wxICON_ERROR, NULL); return false; } // rc = (sqlExecAdd)(newdb, "PRAGMA user_version", versionCallback, 0, &zErrMsg); // if( rc!=SQLITE_OK ){ // MessageBox(NULL, zErrMsg, "SQL error!", // MB_ICONEXCLAMATION | MB_OK); // }else{ // if(db != NULL){ // (sqlCloseAdd) (db); // } // db = newdb; // HWND hStatus; // hStatus = GetDlgItem(hwnd,IDC_MAIN_STATUS); // } db = newdb; dbValid = true; return true; } bool dbConnection::closeFile(){ if(dbValid){ (sqlCloseAdd)(db); } dbValid = false; return true; } wxString dbConnection::getFileName(){ return path; } ----------------------------------------------------------------------------- To unsubscribe, send email to [EMAIL PROTECTED] -----------------------------------------------------------------------------