控制台程序连接db2数据库时,连接正确,下一步SQLExecDirect 执行一句SQL语句失败,求大神告知原因。 5C

程序报错情况(如下图):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;
}

2个回答

从报错看,是调用函数时,参数个数或类型错误。cliRC = SQLExecDirect(hstmt, (SQLCHAR FAR*)strSQL, SQL_NTS);
这里使用FAR是否画蛇添足?改成cliRC = SQLExecDirect(hstmt, (SQLCHAR *)strSQL, SQL_NTS); 试试

tzlCSDN
tzlCSDN 谢谢!初学,数据库的命名乱了...
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问