日期:2014-05-16  浏览次数:20910 次

C++中ADO调用MySQL存储过程失败,诡异的语法错误,求解中,附源码
不管怎么调整,死活都出现下面的错误
C++ADO代码我实在找不到什么错误了,难道是MySQL有什么问题,或者有其他需要注意的地方(类似存储过程权限之类的,我都看了,我用root连接啊)
navicat 查询编辑器 执行 call PrGs_GameUser_Login('sdfdsfdsfd') 是没有问题的
根据下面错误信息,难道ADO的CommandText 多了中括号“{”“}”,所以出错?

执行存储过程失败!
  CommandText={ call PrGs_GameUser_Login(?) }
  Description=You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '{ call PrGs_GameUser_Login('sdfdsfdsfd') }' at line 1
  ErrorMessage()=I
  Error()=80040e14
  Source()=Microsoft OLE DB Provider for ODBC Drivers


存储过程 PrGs_GameUser_Login 没啥可说的,就是一个输入参数,内容是空的

C++源代码
_ConnectionPtr m_Connection; // 数据库连接对象
//_RecordsetPtr m_Recordset; // 记录集对象
_CommandPtr m_Command; // 命令对象

if (m_Connection != NULL || m_Command != NULL/* || m_Recordset != NULL*/)
{
return;
}

try
{
CoInitialize(NULL);

if (FAILED(m_Connection.CreateInstance(__uuidof(Connection))))
{
return;
}

/*if (FAILED(m_Recordset.CreateInstance(__uuidof(Recordset))))
{
return;
}*/

if (FAILED(m_Command.CreateInstance(__uuidof(Command))))
{
return;
}
m_Connection->CursorLocation = adUseClient;
// 把结果集和命令对象关联起来
//m_Recordset->PutRefSource(m_Command);
//m_Recordset->CursorLocation = adUseClient;
// 只支持存储过程调用
m_Command->CommandType = adCmdStoredProc;
}
catch (...)
{
return;
}
if (m_Connection->State != adStateClosed)
{
return;
}
if (FAILED(m_Connection->Open("Driver={MySQL ODBC 3.51 Driver};Server=192.168.1.107;Port=3306;Option=4;Database=yxgamedb;Uid=root;Pwd=123456;"
, L"", L"", adConnectUnspecified)))
{
return ;
}
m_Connection->CommandTimeout = 60;
m_Command->CommandTimeout = 60;
m_Command->ActiveConnection = m_Connection;

std::string userName = "sdfdsfdsfd";
//int outParam = 4;

m_Command->CommandText = L"PrGs_GameUser_Login";
_ParameterPtr spParam1 = m_Command->CreateParameter("UserName", adVarChar, adParamInput, 33, (_variant_t)(userName.c_str()));
if (FAILED(m_Command->Parameters->Append(spParam1)))
{
return;
}
/*_ParameterPtr spParam2 = m_Command->CreateParameter("OutParam", adInteger, adParamOutput, 4, (_variant_t)outParam);
if (FAILED(m_Command->Parameters->Append(spParam2)))
{
return;
}*/

try
{
m_Command->Execute(NULL, NULL, adExecuteNoRecords);
}
catch (_com_error &e)
{
PrintInfoLog("执行存储失败!\n CommandText=%s\n Description()=%s\n ErrorMessage()=%s\n Error()=%08lx\n Error()=%s",
(LPSTR)m_Command->CommandText, (LPSTR)e.Description(), (LPSTR)e.ErrorMessage(),
e.Error(), (LPSTR)e.Source());
return;
}

------解决方案--------------------
你的MYSQL版本与ODBC的版本是多少? 以前的版本上是有类似这个BUG的。