Avatar billede neuro Nybegynder
06. november 2001 - 12:17 Der er 1 løsning

SQL / C++ med sqlext.h

jeg er igand med at lave en class som skal kunne udføre lidt DB arbejde for mig. jeg benytter sqlext.h.

problemet ligger i mint SetSQL funktion, den får ikke converteret det rigtigt eller lignende.

<!---------- KODE

#include \"stdafx.h\"

#include <windows.h>
#include <sqlext.h>
#include \"stdlib.h\"

class BDAC {

    public:
        bool adIsOpen;
        char **rs;
        unsigned char *sql;

        BDAC() {
           
            adIsOpen=false;
            rs=NULL;
            sql=NULL;
       
        }
   
        ~BDAC() {

            if (rs!=NULL) { free(rs); }
            if (sql!=NULL) { free(sql); }

        }

        void SetSQL(char *s) {

            int l,j;
           
            l=strlen(s);

            sql=(unsigned char*)malloc((l*sizeof(unsigned char))+1);           
            for (j=0;j<l;j++) {    sql[j]=(unsigned char)s[j];    }           
            sql[l]=NULL;

        }

        void GetData() {

            //unsigned char        szSql[]=\"select * from cpp\";                        // SQL string
            unsigned char        szDSN[SQL_MAX_DSN_LENGTH] = \"LOCAL_DB\";              // Data Source Name buffer
            unsigned char*        szUID = NULL;                                          // User ID buffer
            unsigned char*        szPasswd = NULL;                                      // Password buffer           
            HENV                hEnv = NULL;                                        // Env Handle from SQLAllocEnv()
            HDBC                hDBC = NULL;                                        // Connection handle
            HSTMT                hStmt = NULL;                                      // Statement handle           
            UCHAR                szModel[200];                                      // Model buffer
            SDWORD                cbModel;                                            // Model buffer bytes recieved           
            RETCODE                retcode;                                            // Return code

            // Allocate memory for ODBC Environment handle
            SQLAllocEnv (&hEnv);
           
            // Allocate memory for the connection handle
            SQLAllocConnect (hEnv, &hDBC);
           
            // Connect to the data source \"db97\" using userid and password.
            retcode = SQLConnect (hDBC, szDSN, SQL_NTS, szUID, SQL_NTS, szPasswd, SQL_NTS);
            if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { adIsOpen=true; }
           
            if (adIsOpen) {

                    // Allocate memory for the statement handle
                    retcode = SQLAllocStmt (hDBC, &hStmt);
           
                    // Prepare the SQL statement by assigning it to the statement handle
                    retcode = SQLPrepare (hStmt, sql, sizeof (sql));
           
                    // Execute the SQL statement handle
                    retcode = SQLExecute (hStmt);
           
                    // Project only column 1 which is the models
                    SQLBindCol (hStmt, 2, SQL_C_CHAR, szModel, sizeof(szModel), &cbModel);
           
                    // Get row of data from the result set defined above in the statement
                    retcode = SQLFetch (hStmt);
           
                    while (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {

                            printf (\"* %s\\n\", szModel);            // Print row (model)
                            retcode = SQLFetch (hStmt);            // Fetch next row from result set

                    }
           
                    // Free the allocated statement handle
                    SQLFreeStmt (hStmt, SQL_DROP);
           
                    // Disconnect from datasource
                    SQLDisconnect (hDBC);
           
            }
           
            // Free the allocated connection handle
            SQLFreeConnect (hDBC);
           
            // Free the allocated ODBC environment handle
            SQLFreeEnv (hEnv);

        }

};

void main(int argc, char* argv[]) {

    BDAC *db = new BDAC;

    db->SetSQL(\"select * from cpp\");   
    printf(\"SQL=\'%s\'\\n\\n\",db->sql);

    db->GetData();

    delete db;
   
};

<------- KODE

hvis nogen har efaring med dette, vil jeg meget gerne høre hvordan jeg skal bærer mig ad med at få det til at virke?

jeg får ingen compiler fejl, eller runtime fejl - den får bare ikke noget ud af basen. og jeg er sikker på det er min sql. da jeg har testet med den szSqlStr som er udkommenteret, og der virker det fint. det nytter jo bare ikke noget at bruge den, da sql sætningen så er defineret i objektet, og det kan man ikke bruge til noget i længden!

Avatar billede neuro Nybegynder
06. november 2001 - 13:16 #1
har selv fundet ud af det .. i stedet for at bruge SQLPrepare og SQLExecute, kunne jeg bare benytte SQLExecDirect.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester