User forums > General (but related to Code::Blocks)

many impossible to understand errors

(1/3) > >>

cotede2:
Hello, I found a script to handle database connection and queries.
I created two files:

testdbb.h

--- Code: ---#ifndef TESTDB_H_INCLUDED
#define TESTDB_H_INCLUDED

#include <wx/app.h>

class testdb : public wxApp
{
    public:
         int connexion();
         int HandleError(wxString errmsg, wxDb *pDb=NULL);
};

#endif // TESTDB_H_INCLUDED

--- End code ---

and

testdb.cpp


--- Code: ---// ----------------------------------------------------------------------------
// HEADERS
// ----------------------------------------------------------------------------
#include "wx/log.h"         // #included to enable output of messages only
#include "wx/dbtable.h"

// ----------------------------------------------------------------------------
// FUNCTION USED FOR HANDLING/DISPLAYING ERRORS
// ----------------------------------------------------------------------------
// Very generic error handling function.
// If a connection to the database is passed in, then we retrieve all the
// database errors for the connection and add them to the displayed message
int HandleError(wxString errmsg, wxDb *pDb=NULL)
{
    // Retrieve all the error message for the errors that occurred
    wxString allErrors;
    if (!pDb == NULL)
        // Get the database errors and append them to the error message
        allErrors = wxDbLogExtendedErrorMsg(errmsg.c_str(), pDb, 0, 0);
    else
        allErrors = errmsg;

    // Do whatever you wish with the error message here
    // wxLogDebug() is called inside wxDbLogExtendedErrorMsg() so this
    // console program will show the errors in the console window,
    // but these lines will show the errors in RELEASE builds also
    wxFprintf(stderr, wxT("\n%s\n"), allErrors.c_str());
    fflush(stderr);

    return 1;
}


// ----------------------------------------------------------------------------
// entry point
// ----------------------------------------------------------------------------
int connexion()
{
wxDbConnectInf  *DbConnectInf    = NULL;    // DB connection information

wxDb            *db              = NULL;    // Database connection

wxDbTable       *table           = NULL;    // Data table to access
const wxChar     tableName[]     = wxT("USERS"); // Name of database table
const UWORD      numTableColumns = 2;       // Number table columns
wxChar           FirstName[50+1];           // column data: "FIRST_NAME"
wxChar           LastName[50+1];            // column data: "LAST_NAME"

wxString         msg;                       // Used for display messages

// -----------------------------------------------------------------------
// DEFINE THE CONNECTION HANDLE FOR THE DATABASE
// -----------------------------------------------------------------------
DbConnectInf = new wxDbConnectInf(NULL,
                                    wxT("CONTACTS-SqlServer"),
                                    wxT("sa"),
                                    wxT("abk"));

// Error checking....
if (!DbConnectInf || !DbConnectInf->GetHenv())
{
    return HandleError(wxT("DB ENV ERROR: Cannot allocate ODBC env handle"));
}


// -----------------------------------------------------------------------
// GET A DATABASE CONNECTION
// -----------------------------------------------------------------------
db = wxDbGetConnection(DbConnectInf);

if (!db)
{
    return HandleError(wxT("CONNECTION ERROR - Cannot get DB connection"));
}


// -----------------------------------------------------------------------
// DEFINE THE TABLE, AND THE COLUMNS THAT WILL BE ACCESSED
// -----------------------------------------------------------------------
table = new wxDbTable(db, tableName, numTableColumns, wxT(""),
                    !wxDB_QUERY_ONLY, wxT(""));
//
// Bind the columns that you wish to retrieve. Note that there must be
// 'numTableColumns' calls to SetColDefs(), to match the wxDbTable def
//
// Not all columns need to be bound, only columns whose values are to be
// returned back to the client.
//
table->SetColDefs(0, wxT("FIRST_NAME"), DB_DATA_TYPE_VARCHAR, FirstName,
                SQL_C_WXCHAR, sizeof(FirstName), true, true);
table->SetColDefs(1, wxT("LAST_NAME"), DB_DATA_TYPE_VARCHAR, LastName,
                SQL_C_WXCHAR, sizeof(LastName), true, true);


// -----------------------------------------------------------------------
// CREATE (or RECREATE) THE TABLE IN THE DATABASE
// -----------------------------------------------------------------------
if (!table->CreateTable(true))  //NOTE: No CommitTrans is required
{
    return HandleError(wxT("TABLE CREATION ERROR: "), table->GetDb());
}


// -----------------------------------------------------------------------
// OPEN THE TABLE FOR ACCESS
// -----------------------------------------------------------------------
if (!table->Open())
{
    return HandleError(wxT("TABLE OPEN ERROR: "), table->GetDb());
}


// -----------------------------------------------------------------------
// INSERT A NEW ROW INTO THE TABLE
// -----------------------------------------------------------------------
wxStrcpy(FirstName, wxT("JULIAN"));
wxStrcpy(LastName, wxT("SMART"));
if (!table->Insert())
{
    return HandleError(wxT("INSERTION ERROR: "), table->GetDb());
}

// Must commit the insert to write the data to the DB
table->GetDb()->CommitTrans();


// -----------------------------------------------------------------------
// RETRIEVE ROWS FROM THE TABLE BASED ON SUPPLIED CRITERIA
// -----------------------------------------------------------------------
// Set the WHERE clause to limit the result set to return
// all rows that have a value of 'JULIAN' in the FIRST_NAME
// column of the table.
table->SetWhereClause(wxT("FIRST_NAME = 'JULIAN'"));

// Result set will be sorted in ascending alphabetical
// order on the data in the 'LAST_NAME' column of each row
table->SetOrderByClause(wxT("LAST_NAME"));

// No other tables (joins) are used for this query
table->SetFromClause(wxT(""));

// Instruct the datasource to perform a query based on the
// criteria specified above in the where/orderBy/from clauses.
if (!table->Query())
{
    return HandleError(wxT("QUERY ERROR: "), table->GetDb());
}

// Loop through all rows matching the query criteria until
// there are no more records to rea d
while (table->GetNext())
{
    msg.Printf(wxT("Row #%lu -- First Name : %s  Last Name is %s"),
            table->GetRowNum(), FirstName, LastName);

    // Code to display 'msg' here
    wxLogMessage(wxT("\n%s\n"), msg.c_str());
}


// -----------------------------------------------------------------------
// DELETE A ROW FROM THE TABLE
// -----------------------------------------------------------------------
// Select the row which has FIRST_NAME of 'JULIAN' and LAST_NAME
// of 'SMART', then delete the retrieved row
//
if (!table->DeleteWhere(wxT("FIRST_NAME = 'JULIAN' and LAST_NAME = 'SMART'")))
{
    return HandleError(wxT("DELETION ERROR: "), table->GetDb());
}

// Must commit the deletion to the database
table->GetDb()->CommitTrans();


// -----------------------------------------------------------------------
// TAKE CARE OF THE ODBC CLASS INSTANCES THAT WERE BEING USED
// -----------------------------------------------------------------------
// If the wxDbTable instance was successfully created
// then delete it as we are done with it now.
wxDELETE(table);

// Free the cached connection
// (meaning release it back in to the cache of datasource
// connections) for the next time a call to wxDbGetConnection()
// is made.
wxDbFreeConnection(db);
db = NULL;


// -----------------------------------------------------------------------
// CLEANUP BEFORE EXITING APP
// -----------------------------------------------------------------------
// The program is now ending, so we need to close
// any cached connections that are still being
// maintained.
wxDbCloseConnections();

// Release the environment handle that was created
// for use with the ODBC datasource connections
wxDELETE(DbConnectInf);

//wxUnusedVar(argc);  // Here just to prevent compiler warnings
//wxUnusedVar(argv);  // Here just to prevent compiler warnings

return 0;
}

--- End code ---


--- Quote ---obj\Release\testdb.o:testdb.cpp:(.text+0x5f)||undefined reference to `__imp___Z23wxDbLogExtendedErrorMsgPKwP4wxDbS0_i'|
obj\Release\testdb.o:testdb.cpp:(.text+0x385)||undefined reference to `__imp___ZN14wxDbConnectInfC1EPvRK8wxStringS3_S3_S3_S3_S3_'|
obj\Release\testdb.o:testdb.cpp:(.text+0xbfc)||undefined reference to `__imp___Z17wxDbGetConnectionP14wxDbConnectInfb'|
obj\Release\testdb.o:testdb.cpp:(.text+0xd0d)||undefined reference to `__imp___ZN9wxDbTableC1EP4wxDbRK8wxStringtS4_bS4_'|
obj\Release\testdb.o:testdb.cpp:(.text+0xe1d)||undefined reference to `__imp___ZN9wxDbTable10SetColDefsEtRK8wxStringiPvsibbbb'|
obj\Release\testdb.o:testdb.cpp:(.text+0xedf)||undefined reference to `__imp___ZN9wxDbTable10SetColDefsEtRK8wxStringiPvsibbbb'|
obj\Release\testdb.o:testdb.cpp:(.text+0xf3a)||undefined reference to `__imp___ZN9wxDbTable11CreateTableEb'|
obj\Release\testdb.o:testdb.cpp:(.text+0x119e)||undefined reference to `__imp___ZN9wxDbTable4OpenEbb'|
obj\Release\testdb.o:testdb.cpp:(.text+0x12a9)||undefined reference to `__imp___ZN9wxDbTable6InsertEv'|
obj\Release\testdb.o:testdb.cpp:(.text+0x1389)||undefined reference to `__imp___ZN4wxDb11CommitTransEv'|
obj\Release\testdb.o:testdb.cpp:(.text+0x1616)||undefined reference to `__imp___ZN9wxDbTable6getRecEt'|
obj\Release\testdb.o:testdb.cpp:(.text+0x1627)||undefined reference to `__imp___ZN9wxDbTable9GetRowNumEv'|
obj\Release\testdb.o:testdb.cpp:(.text+0x16d0)||undefined reference to `__imp___ZN9wxDbTable11DeleteWhereERK8wxString'|
obj\Release\testdb.o:testdb.cpp:(.text+0x17f1)||undefined reference to `__imp___ZN4wxDb11CommitTransEv'|
obj\Release\testdb.o:testdb.cpp:(.text+0x181a)||undefined reference to `__imp___Z18wxDbFreeConnectionP4wxDb'|
obj\Release\testdb.o:testdb.cpp:(.text+0x1822)||undefined reference to `__imp___Z20wxDbCloseConnectionsv'|
obj\Release\testdb.o:testdb.cpp:(.text+0x183b)||undefined reference to `__imp___ZN14wxDbConnectInfD1Ev'|
||=== Build finished: 17 errors, 0 warnings ===|

--- End quote ---

I cannot understand those errors when I compile.
Thanks for ur help

stahta01:
Read this
http://docs.wxwidgets.org/stable/wx_odbcoverview.html#wxodbcconfiguringyoursystem
http://docs.wxwidgets.org/stable/wx_librarieslist.html#librarieslist

After verifying your wxWidgets folder has an correct db library(I am not sure of its name), add it to the C::B Linker Library List.

Tim S.

cotede2:
Is the db library related to wxwidgets?
In other words, how does the compiler knows which database type I want to query?
I am familiar with using connector with java (postgresql , mysql, sql server, db2..) but nope with c++ .
Let's say I want to query on a mysql database.
Where is the db library?
I read the documentation and I assume
"Most database vendors provide at least a minimal ODBC driver with their database product. In practice, many of these drivers have proven to be slow and/or incomplete. Rumour has it that this is because the vendors do not want you using the ODBC interface to their products; they want you to use their applications to access the data."


I am going to the system datasource of the admin datasources odbc of my windows XP.
I see several options and so I configure into my program :

--- Code: ---DbConnectInf = new wxDbConnectInf(NULL,
                                    wxT("dsTracking"),
                                    wxT("sa"),
                                    wxT("***"));

--- End code ---
But I still got the same error cause I don't know what kind of libraries and where exactly to put it.
Thanks for more information.

I also found interesting topic http://wiki.wxwidgets.org/ODBC
But I don't know how to import samples/db into codeblocks and make the project compiled.

Thanks for help

stahta01:
If your wxWidgets does not have the right library then re-compile it with the proper options to create the needed library for wxDbTable class methods.

Tim S.

cotede2:
I am a little confused right here.
What do I have to do step by step?
Open codeblocks? open wxwidgets? Usually when I do compile, I just hit the compile button and I dont provide any options.
thank you, could you be more precise

Navigation

[0] Message Index

[#] Next page

Go to full version