程序报错情况(如下图):esp的值没有在函数调用中正确保存
程序执行结果如下图:
可以看到,程序执行到“//查询语句前”都是正确的,但是SQLExecDirect函数执行一个select * from yuangong语句不成功。
另外:语句select * from yuangong在db2数据库的命令处理器中使用时完全可以的。
以下是代码:
#include "pch.h"
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <sqlcli.h>
#include <sqlcli1.h>
#include <sqlenv.h>
#include <sqlda.h>
#include <sqlca.h>
#include <string.h>
using namespace std;
struct result
{
char ename[50];
char cname[100];
int ename_len;
int cname_len;
result()
{
memset(ename, '\0', sizeof(ename));
memset(cname, '\0', sizeof(cname));
}
};
int main()
{
SQLRETURN cliRC = SQL_SUCCESS;
SQLHANDLE henv = SQL_NULL_HENV;
SQLHANDLE hdbc = SQL_NULL_HDBC;
SQLHANDLE hstmt = SQL_NULL_HSTMT;
//获取环境句柄
cliRC = SQLAllocHandle(
SQL_HANDLE_ENV,
SQL_NULL_HANDLE,
&henv);
//获取连接句柄
cliRC = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
cliRC = SQLSetConnectAttr(hdbc,
SQL_ATTR_AUTOCOMMIT,
(SQLPOINTER)SQL_AUTOCOMMIT_OFF,
SQL_IS_INTEGER);
cliRC = SQLConnect(hdbc,
(SQLCHAR *)"ak47", SQL_NTS,
(SQLCHAR *)"test", SQL_NTS,
(SQLCHAR *)"test", SQL_NTS);
if (cliRC == SQL_SUCCESS)
{
cout << "connect successfully" << endl;
}
//设置连接
cliRC = SQLSetConnection(hdbc);
//获取操作句柄
SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
cliRC = SQLSetStmtAttr(hstmt,
SQL_ATTR_DEFERRED_PREPARE,
(SQLPOINTER)SQL_DEFERRED_PREPARE_ON,
SQL_IS_INTEGER);
cliRC = SQLSetStmtAttr(hstmt,
SQL_ATTR_BLOCK_FOR_NROWS,
(SQLPOINTER)100,
SQL_IS_INTEGER);
if (cliRC == SQL_SUCCESS )
{
cout << "setStmtAttr" << endl;
};
//查询语句
const char * strSQL = "select * from yuangong";
cliRC = SQLExecDirect(hstmt, (SQLCHAR FAR*)strSQL, SQL_NTS);
if (cliRC == SQL_SUCCESS)
{
cout << "SQL execute successfully" << endl;
}
SQLSMALLINT ulColumns = 0;
//结束会话
cliRC = SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_COMMIT);
//释放资源
cliRC = SQLFreeStmt(hstmt, SQL_UNBIND);
cliRC = SQLFreeStmt(hstmt, SQL_CLOSE);
return 0;
}