最近使用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一样呢。
请各位高手帮帮忙啊!
谢谢!