代码如下: SQLRETURN rtcode; //Distribute ODBC Environment SQLHENV henv; rtcode=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv); if (rtcode!=SQL_SUCCESS) { //TRACE("Can not allocate env handle \n"); MessageBox("Can not allocate env handle ","Tips",MB_OK); }
//Version Settings rtcode=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(void *)SQL_OV_ODBC3,0); if (rtcode!=SQL_SUCCESS) { //TRACE("Can not set ODBC Version\n"); MessageBox("Can not set ODBC Version","Tips",MB_OK); }
//Distribute Connect Handle SQLHDBC hdbc; rtcode=SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc); if (rtcode!=SQL_SUCCESS ) { //TRACE("Can not allocate Connect Handle\n"); MessageBox("Can not allocate Connect Handle","Tips",MB_OK); } //Connection Attributes Settings rtcode=SQLSetConnectAttr(hdbc,SQL_LOGIN_TIMEOUT,(void*)5,0); if (rtcode!=SQL_SUCCESS) { //TRACE("Error in set connect attribute\n"); MessageBox("Error in set connect attribute","Tips",MB_OK); }
//Connect the Datasource rtcode=SQLConnect(hdbc,(SQLCHAR *)"test",SQL_NTS, (SQLCHAR *)"Yamazaki",SQL_NTS, (SQLCHAR *)"yamazaki",SQL_NTS); // rtcode=SQLConnect(hdbc,(SQLCHAR *)"not",SQL_NTS,NULL,SQL_NTS,NULL,SQL_NTS); if (rtcode!=SQL_SUCCESS) { //TRACE("Error in connect to Datasource\n"); MessageBox("Error in connect to Datasource","Tips",MB_OK); //MessageBox("数据源连接失败!","信息提示",MB_OK); //Deal with Diagnostic Info SQLCHAR Sqlstate[6]; SQLINTEGER NativeError; SQLHANDLE hDbConn; SQLCHAR ErrMsg[SQL_MAX_MESSAGE_LENGTH]; int i=1; while(SQLGetDiagRec(SQL_HANDLE_DBC,hDbConn,i,Sqlstate,&NativeError,ErrMsg,sizeof(ErrMsg),NULL)!=SQL_NO_DATA) { TRACE("Diagnostic:d%,SQLSTATE:%s,NativeError:%d,ErrorMsg:%s\n",i++,Sqlstate,NativeError,ErrMsg); } } else { MessageBox("数据源连接成功!","信息提示",MB_OK); } //Allocate statement handle //Process Data SQLDisconnect(hdbc); SQLFreeHandle(SQL_HANDLE_DBC,hdbc); SQLFreeHandle(SQL_HANDLE_ENV,henv);
可以运行,就是在连接时弹出错误窗口。我用的开发工具是Visual C++ 6.0,数据库为SQL Server 2000。
有正确的解决办法…这里的问题是由于条件判断错误导致的,谢谢oldmanzhao的一路帮助!正确的条件判断应该为: if (rtcode!=SQL_SUCCESS&&(rtcode!=SQL_SUCCESS_WITH_INFO)) { //TRACE("Error in connect to Datasource\n"); MessageBox("Error in connect to Datasource","Tips",MB_OK); //MessageBox("数据源连接失败!","信息提示",MB_OK); //Deal with Diagnostic Info SQLCHAR Sqlstate[6]; SQLINTEGER NativeError; SQLHANDLE hDbConn; SQLCHAR ErrMsg[SQL_MAX_MESSAGE_LENGTH]; int i=1; while(SQLGetDiagRec(SQL_HANDLE_DBC,hDbConn,i,Sqlstate,&NativeError,ErrMsg,sizeof(ErrMsg),NULL)!=SQL_NO_DATA) { TRACE("Diagnostic:d%,SQLSTATE:%s,NativeError:%d,ErrorMsg:%s\n",i++,Sqlstate,NativeError,ErrMsg); } }
SQLRETURN rtcode;
//Distribute ODBC Environment
SQLHENV henv;
rtcode=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);
if (rtcode!=SQL_SUCCESS)
{
//TRACE("Can not allocate env handle \n");
MessageBox("Can not allocate env handle ","Tips",MB_OK);
}
//Version Settings
rtcode=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(void *)SQL_OV_ODBC3,0);
if (rtcode!=SQL_SUCCESS)
{
//TRACE("Can not set ODBC Version\n");
MessageBox("Can not set ODBC Version","Tips",MB_OK);
}
//Distribute Connect Handle
SQLHDBC hdbc;
rtcode=SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);
if (rtcode!=SQL_SUCCESS )
{
//TRACE("Can not allocate Connect Handle\n");
MessageBox("Can not allocate Connect Handle","Tips",MB_OK);
} //Connection Attributes Settings
rtcode=SQLSetConnectAttr(hdbc,SQL_LOGIN_TIMEOUT,(void*)5,0);
if (rtcode!=SQL_SUCCESS)
{
//TRACE("Error in set connect attribute\n");
MessageBox("Error in set connect attribute","Tips",MB_OK);
}
//Connect the Datasource
rtcode=SQLConnect(hdbc,(SQLCHAR *)"test",SQL_NTS,
(SQLCHAR *)"Yamazaki",SQL_NTS,
(SQLCHAR *)"yamazaki",SQL_NTS);
// rtcode=SQLConnect(hdbc,(SQLCHAR *)"not",SQL_NTS,NULL,SQL_NTS,NULL,SQL_NTS);
if (rtcode!=SQL_SUCCESS)
{
//TRACE("Error in connect to Datasource\n");
MessageBox("Error in connect to Datasource","Tips",MB_OK);
//MessageBox("数据源连接失败!","信息提示",MB_OK); //Deal with Diagnostic Info
SQLCHAR Sqlstate[6];
SQLINTEGER NativeError;
SQLHANDLE hDbConn;
SQLCHAR ErrMsg[SQL_MAX_MESSAGE_LENGTH];
int i=1;
while(SQLGetDiagRec(SQL_HANDLE_DBC,hDbConn,i,Sqlstate,&NativeError,ErrMsg,sizeof(ErrMsg),NULL)!=SQL_NO_DATA)
{
TRACE("Diagnostic:d%,SQLSTATE:%s,NativeError:%d,ErrorMsg:%s\n",i++,Sqlstate,NativeError,ErrMsg);
}
}
else
{
MessageBox("数据源连接成功!","信息提示",MB_OK);
}
//Allocate statement handle
//Process Data
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
SQLFreeHandle(SQL_HANDLE_ENV,henv);
73546B14 cmp dword ptr [eax],2
{
TRACE("Diagnostic:d%,SQLSTATE:%s,NativeError:%d,ErrorMsg:%s\n",i++,Sqlstate,NativeError,ErrMsg);
}
运行到上面的函数时出的错误,hDbConn的值为0xcccccccc。
http://topic.csdn.net/t/20021227/18/1306506.html
if (rtcode!=SQL_SUCCESS&&(rtcode!=SQL_SUCCESS_WITH_INFO))
{
//TRACE("Error in connect to Datasource\n");
MessageBox("Error in connect to Datasource","Tips",MB_OK);
//MessageBox("数据源连接失败!","信息提示",MB_OK); //Deal with Diagnostic Info
SQLCHAR Sqlstate[6];
SQLINTEGER NativeError;
SQLHANDLE hDbConn;
SQLCHAR ErrMsg[SQL_MAX_MESSAGE_LENGTH];
int i=1;
while(SQLGetDiagRec(SQL_HANDLE_DBC,hDbConn,i,Sqlstate,&NativeError,ErrMsg,sizeof(ErrMsg),NULL)!=SQL_NO_DATA)
{
TRACE("Diagnostic:d%,SQLSTATE:%s,NativeError:%d,ErrorMsg:%s\n",i++,Sqlstate,NativeError,ErrMsg);
}
}