如何让_CommandPtr输出他执行的实际sql语句,高分求助,可以加分

tangyulong1214 2011-05-19 05:57:36
int ExecuteProcedureEx(LPCSTR lpstrSPName, vector<stuParms> &vecParams, int *lpRet)
{
try
{
if( !lpstrSPName || !lpRet )
return -1;

//第一个为返回值
_CommandPtr cmdRet;
size_t szCount = vecParams.size();
_variant_t varRoyalty = COleVariant( static_cast<long>(0) );
cmdRet.CreateInstance( __uuidof(Command) );
cmdRet->Parameters->Append( cmdRet->CreateParameter("Return", adInteger, adParamReturnValue, sizeof(long), varRoyalty ) );
for (int i=0; i<szCount; ++i) //‘0’ 位置为返回值位
{
stuParms stuTmp = vecParams[i];
_ParameterPtr prmTmp= cmdRet->CreateParameter(stuTmp.m_Name, stuTmp.m_Type, stuTmp.m_Direction, stuTmp.m_Size, stuTmp.m_Value);
cmdRet->Parameters->Append( prmTmp );
}

//执行存储过程
cmdRet->CommandText = lpstrSPName; //存储过程名
cmdRet->PutCommandType(adCmdStoredProc);
cmdRet->ActiveConnection = m_pCon;

cmdRet->Execute(0, 0, adCmdStoredProc);

//_bstr_t lpPrt = cmdRet->GetCommandText();
//它只能输出如此:{ ? = call 存储过程名 (?, ?, ?) }
//在输出完整的sql,就是说‘?’被真正参数替换!

_variant_t varRet = cmdRet->Parameters->GetItem("Return")->GetValue();
*lpRet = varRet.lVal;
cmdRet.Release();

return S_OK;
}
catch (_com_error &e)
{
string strError = "Unknown Error";
if(e.Description().length() > 0)
{
strError = e.Description();
}

return -1L;
}
catch(...)
{
return -1L;
}
}
...全文
67 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lihanbing 2011-05-19
  • 打赏
  • 举报
回复
使用参数的话, ? 在最终执行的时会被替换成变量的形式, 不会出现你想要的那种参数直接替换进去的语句

是这种形式

declare @param1 as int,@param2 as varchar(10)
set @param1 = 123
set @param2 = 'abc'
call 存储过程 @param1, param2


而不是简单的

call 存储过程 123, 'abc'
zyq5945 2011-05-19
  • 打赏
  • 举报
回复
那只能直接把他的存储过程设计的表和视图给你,自己再本地测试了。
tangyulong1214 2011-05-19
  • 打赏
  • 举报
回复
这是一个办法,但是数据库不控制在我手上。
所以只能我修改,并记录出来SQL语句,才能证明到底是谁的问题。
zyq5945 2011-05-19
  • 打赏
  • 举报
回复
那在存储过程的入口处把你执行的SQL作为一个out参数返回回来。

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧