先放代码,遇到的问题是 调用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参数是做不到的,主要问题在如果不加参数这些东西是可以读出来的,但是加了参数就获取不到结果集了。。。。