tzlCSDN 2019-06-20 19:17 采纳率: 0%
浏览 507
已结题

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

程序报错情况(如下图):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条回答 默认 最新

  • 关注
    评论

报告相同问题?

悬赏问题

  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
  • ¥50 NT4.0系统 STOP:0X0000007B
  • ¥15 想问一下stata17中这段代码哪里有问题呀
  • ¥15 flink cdc无法实时同步mysql数据
  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决