• 7450阅读
  • 1回复

qt连接数据库的一些问题,请大虾们帮帮忙,谢谢! [复制链接]

上一主题 下一主题
离线perid
 

只看楼主 倒序阅读 楼主  发表于: 2010-06-03
最近使用qt,要求连接数据库,可是连接的数据库不是qt软件自带的一些数据库,是一种国产数据库(达梦数据库),所以安装qt中就没有对应的驱动,所以我就用odbc接口来连接,可是总是出错。希望可以帮我找出错误的地方,以及帮我找到解决办法,谢谢!
 
程序如下:
#include <QtCore/QCoreApplication>
#include<stdio.h>
#include<windows.h>
#include<sql.h>
#include<sqltypes.h>
#include<sqlext.h>
//#include "odbc_api_ex.h"
#undef UNICODE
#define RC_SUCCESSFUL(rc) ((rc) == SQL_SUCCESS || (rc) == SQL_SUCCESS_WITH_INFO)
#define RC_NOTSUCCESSFUL(rc) (!(RC_SUCCESSFUL(rc)))
int main(int argc, char *argv[])
{
         QCoreApplication a(argc, argv);
        //testResult sign
        //1: successful
        //0: failed
        int Result = 1;
        //
        SQLRETURN sret;
        //connect argument
        char* UID = (char*)"SYSDBA";   // "SYSDBA"
        char* PWD = (char*)"SYSDBA";   // "SYSDBA"
        char* SERVER = (char*)"localhost";  // "localhost"
        char* DATABASE = (char*)"SYSTEM"; // "SYSTEM"
        if(argc>1)
        {
                SERVER = argv[1];
        }
        if(argc>2)
        {
                UID = argv[2];
        }
        if(argc>3)
        {
                PWD = argv[3];
        }
        if(argc>4)
        {
                DATABASE = argv[4];
        }
        HENV henv1;
        HDBC hdbc1;
        HSTMT hstmt1;
        HENV henv2;
        HDBC hdbc2;
        char ConnectString[150];
        char* SQLString;

        wsprintf((WCHAR*)ConnectString, (WCHAR*)"DRIVER=DM ODBC DRIVER;SERVER=%s;UID=%s;PWD=%s;DATABASE=%s", SERVER, UID, PWD, DATABASE);//连接数据库,达梦数据库
        SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv1);
        SQLSetEnvAttr(henv1, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
        SQLSetEnvAttr(henv1, SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
        SQLAllocHandle(SQL_HANDLE_DBC, henv1, &hdbc1);
        printf("create connectiont 1……\n");
        printf("connectiont 1: %s\n", ConnectString);
        printf("connectiont 1: connect……\n");
        sret = SQLDriverConnect(hdbc1, NULL, (SQLWCHAR *)ConnectString, SQL_NTS, NULL, NULL, NULL,SQL_DRIVER_COMPLETE);
        if(RC_NOTSUCCESSFUL(sret))
        {
                Result = 0;
                printf("connectiont 1: connect failed!\n");
        }
        else
        {
                printf("connectiont 1: connect successful!\n");
                //set connection autocommit off
                SQLSetConnectAttr(hdbc1, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_IS_INTEGER);
                //execute  procedure dm_reorganize_index, but no commit
                SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
                SQLString = (char*)"create table T1_90001(c1 int,c2 int);";
                printf("connectiont 1: %s\n", SQLString);
                SQLExecDirectEx(hstmt1, (SQLCHAR *)SQLString, SQL_NTS);
                SQLString = (char*)"create or replace procedure P1_90001 as begin for i in 1..100 loop for j in 1..1000 loop insert into T1_90001 values(j,j);end loop;commit;end loop;end;";
                /*
                printf("connectiont 1: %s\n", SQLString);
                SQLExecDirect(hstmt1, (SQLWCHAR *)SQLString, SQL_NTS);
                SQLString = "call P1_90001;";
                printf("connectiont 1: %s\n", SQLString);
                SQLExecDirect(hstmt1, (SQLWCHAR *)SQLString, SQL_NTS);
                SQLString = "create index iT1_90001_c1 on T1_90001(c1);";
                printf("connectiont 1: %s\n", SQLString);
                SQLExecDirect(hstmt1, (SQLWCHAR *)SQLString, SQL_NTS);
                SQLString = "update T1_90001 set c1=c2+1;";
                printf("connectiont 1: %s\n", SQLString);
                SQLExecDirect(hstmt1, (SQLWCHAR *)SQLString, SQL_NTS);
                SQLString = "commit;";
                printf("connectiont 1: %s\n", SQLString);
                SQLExecDirect(hstmt1, (SQLWCHAR *)SQLString, SQL_NTS);
                SQLString = "select dm_reorganize_index('SYSTEM','SYSDBA','iT1_90001_c1');";
                printf("connectiont 1: %s\n", SQLString);
                SQLExecDirect(hstmt1, (SQLWCHAR *)SQLString, SQL_NTS);
*/
                //after executing procedure dm_reorganize_index without commit, another user login
                //expected result: successful
                SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv2);
                SQLSetEnvAttr(henv2, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
                SQLSetEnvAttr(henv2, SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
                SQLAllocHandle(SQL_HANDLE_DBC, henv2, &hdbc2);
                printf("create connectiont 2……\n");
                printf("connectiont 2: %s\n", ConnectString);
                printf("connectiont 2: connect……\n");
                sret = SQLDriverConnect(hdbc2, NULL, (SQLWCHAR *)ConnectString, SQL_NTS, NULL, NULL, NULL,SQL_DRIVER_COMPLETE);
                if(RC_NOTSUCCESSFUL(sret))
                {
                        Result = 0;
                        printf("connectiont 2: connect failed!\n");
                }
                else printf("connectiont 2: connect successful!\n");
        }
        /*printf("%s\n",SERVER);
        printf("%s\n",UID);
        printf("%s\n",PWD);
        printf("%s\n",DATABASE);*/
        SQLDisconnect(hdbc1);
        SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
        SQLFreeHandle(SQL_HANDLE_ENV, henv1);
        SQLDisconnect(hdbc2);
        SQLFreeHandle(SQL_HANDLE_DBC, hdbc2);
        SQLFreeHandle(SQL_HANDLE_ENV, henv2);
        //return Result;
        return a.exec();
}

错误:
E:\qt_program\dm_odbc_5_31/main.cpp:67: undefined reference to `SQLDriverConnectW@32'
E:\qt_program\dm_odbc_5_31/main.cpp:78: undefined reference to `SQLSetConnectAttrW@16'
E:\qt_program\dm_odbc_5_31/main.cpp:84: undefined reference to `SQLExecDirectEx(void*, unsigned char*, long)@12'
E:\qt_program\dm_odbc_5_31/main.cpp:115: undefined reference to `SQLDriverConnectW@32'
:-1: error: collect2: ld returned 1 exit status
 
为什么每次调用这些函数时,都是调用后面有“W”的函数,而且函数参数里有字符参数的,都是提示调用的参数为(WCHAR*)这种类型,怎么样才能使调用的函数不是宽字符格式的。可以和使用vc一样呢。
请各位高手帮帮忙啊!
谢谢!
离线akwang
只看该作者 1楼 发表于: 2012-11-02
lz解决没?
快速回复
限100 字节
 
上一个 下一个