笑眯眯哦 2019-09-23 16:01 采纳率: 0%
浏览 565
已结题

如何使用c++通过ADO调用mysql有参存储过程并获取结果集

先放代码,遇到的问题是 调用mysql**有参**存储过程时获取不到结果集

#include <iostream>
#include <atlstr.h>

#import "MSADO15.DLL" rename_namespace("ADOCG") rename("EOF","EndOfFile")
using namespace ADOCG;

using namespace std;

int main() {
    try
    {
        HRESULT hr = CoInitialize(NULL);

        assert(SUCCEEDED(hr));//返回值可判断初始化COM是否成功,请用SUCCEEDED来判断

        _CommandPtr                     m_DBCommand;                        //命令对象
        _RecordsetPtr                   m_DBRecordset;                      //记录对象
        _ConnectionPtr                  m_DBConnection;                     //数据对象

        //创建对象
        m_DBCommand.CreateInstance(__uuidof(Command));
        m_DBRecordset.CreateInstance(__uuidof(Recordset));
        m_DBConnection.CreateInstance(__uuidof(Connection));

        //效验数据
        if (m_DBCommand == NULL) throw TEXT("创建 m_DBCommand 对象失败");
        if (m_DBRecordset == NULL) throw TEXT("创建 m_DBRecordset 对象失败");
        if (m_DBConnection == NULL) throw TEXT("创建 m_DBConnection 对象失败");

        CString m_strConnect;

        //构造连接
        m_strConnect.Format(TEXT("Driver={MySQL ODBC 8.0 Unicode Driver};UID=%s;PWD=%s;DataBase=%s;Persist Security Info=True;Server=%s;Port=%d;Option=3"),
            "hhh", "123456", "Test", "192.168.1.115", 3306);

        //打开连接
        m_DBConnection->Open(_bstr_t(m_strConnect), L"", L"", adConnectUnspecified);

        m_DBConnection->CursorLocation = adUseClient;
        m_DBCommand->ActiveConnection = m_DBConnection;

        assert(SUCCEEDED(hr));//返回值可判断初始化COM是否成功,请用SUCCEEDED来判断

        LONG lParameterCount = m_DBCommand->Parameters->Count;
        if (lParameterCount > 0L)
        {
            for (LONG i = lParameterCount; i > 0; i--)
            {
                m_DBCommand->Parameters->Delete(i - 1);
            }
        }

        //添加参数
        _ParameterPtr Parameter;
        Parameter = m_DBCommand->CreateParameter("wServerID", adInteger, adParamInput, sizeof(LONG), _variant_t((LONG)0));
        m_DBCommand->Parameters->Append(Parameter);
        Parameter = m_DBCommand->CreateParameter("wMachineID", adInteger, adParamInput, sizeof(LONG), _variant_t((LONG)0));
        m_DBCommand->Parameters->Append(Parameter);


        m_DBCommand->CommandText = "LoadGameRoomItem2";
        m_DBCommand->CommandType = adCmdText;

        m_DBRecordset = m_DBCommand->Execute(NULL, NULL, adCmdStoredProc);

        long RecordCount = m_DBRecordset->GetRecordCount();

        cout << RecordCount << endl;

        _variant_t DBVarValue;
        if (m_DBRecordset->EndOfFile != VARIANT_TRUE)
        {
            FieldsPtr RecordFields = m_DBRecordset->GetFields();
            DBVarValue = RecordFields->GetItem("ServerID")->GetValue();
            WORD wValue = DBVarValue;
        }
    }
    catch (_com_error& ComError)
    {

        cout << ComError.Description() << endl;
    }
    return 0;
}

储存过程如下

CREATE DEFINER=`root`@`%` PROCEDURE `LoadGameRoomItem2`(
in wServerID INT,                
in wMachineID INT   
)
BEGIN
SELECT * from gameroominfo;
END

目前遇到的问题就是,怎么也获取不到结果集,RecordCount始终为零(强行读取提示“BOF 或 EOF 中有一个是“真”,或者当前的记录已被删除,所需的操作要求一个当前的记录。”并不是 显示没有其实有,而是确实没有结果集),但是如果我将参数去掉

        //添加参数
//      _ParameterPtr Parameter;
//      Parameter = m_DBCommand->CreateParameter("wServerID", adInteger, adParamInput, sizeof(LONG), _variant_t((LONG)0));
//      m_DBCommand->Parameters->Append(Parameter);
//      Parameter = m_DBCommand->CreateParameter("wMachineID", adInteger, adParamInput, sizeof(LONG), _variant_t((LONG)0));
//      m_DBCommand->Parameters->Append(Parameter);


CREATE DEFINER=`root`@`%` PROCEDURE `LoadGameRoomItem2`(
)
BEGIN
SELECT * from gameroominfo;
END

那么则可以获得结果集(RecordCount数量为40,if (m_DBRecordset->EndOfFile != VARIANT_TRUE)判断能进去,ServerID也能读取到),我试过在存储过程前面后面分别加一个update判断过是不是存储过程没执行成功,但是不管有参无参存储过程,两个Updata都走到了,而且不管有参无参直接在数据库调用都是有结果集的

数据库日志如下

190923 15:32:38  
         7534 Connect   hhh@DESKTOP-989OGGH on Test
         7534 Query SET NAMES utf8
         7534 Query SET character_set_results = NULL
         7534 Query SET SQL_AUTO_IS_NULL = 0
         7534 Query select database()
         7534 Query select database()
         7534 Query SELECT @@tx_isolation
         7534 Query set @@sql_select_limit=DEFAULT
         7534 Query call LoadGameRoomItem2
         7534 Quit  

190923 15:47:54 
         7621 Connect   hhh@DESKTOP-989OGGH on Test
         7621 Query SET NAMES utf8
         7621 Query SET character_set_results = NULL
         7621 Query SET SQL_AUTO_IS_NULL = 0
         7621 Query select database()
         7621 Query select database()
         7621 Query SELECT @@tx_isolation
         7621 Prepare   call LoadGameRoomItem2(?, ?)
         7621 Query set @@sql_select_limit=DEFAULT
         7621 Execute   call LoadGameRoomItem2('0', '0')
         7621 Close stmt    
         7621 Quit  

困扰小弟好几天了,希望各位神仙大佬能帮帮小弟T_T

----------------------------------编辑分界线--------------------------------
图片说明图片说明
如图,是要像这样处理一张表的内容的,单单用output参数是做不到的,主要问题在如果不加参数这些东西是可以读出来的,但是加了参数就获取不到结果集了。。。。

  • 写回答

2条回答

  • Peter(阿斯拉达) 博客专家认证 2019-09-23 16:22
    关注

    是不是你CreateParameter的wMachineID和存储过程里的变量名strMachineID不一致?

    评论

报告相同问题?

悬赏问题

  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办