调用ICommand::Execute函数后如何得知操作的错误信息? hr = CmdObj.m_spCommand->Execute(NULL, IID_ISequentialStream, NULL, NULL, (IUnknown **) &pIXMLOutput );CmdObj 为 CCommand<CNoAccessor,CNoRowset> 类型。如果函数调用失败如何得获取错误信息? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 楼主用的是 OLE DB 吧?我没有用过这个,因为比较复杂,为什么不用 ADO ? 如何用CmdObj或CComPtr对象在执行存储过程或SQL语句时判断连接已失效?附上C++语句: CComPtr<ICommandProperties> pCommandProperties; CComPtr<ICommandText> pCommandText; CComPtr<ISequentialStream> pIXMLOutput; CCommand<CNoAccessor,CNoRowset> CmdObj; USES_CONVERSION; CString Command; if(inXml == NULL) { // 没有参数 Command.Format("exec %s", ProcName); } else if(inXml2 == NULL) { // 如果有一个参数 Command.Format("exec %s '%s'", ProcName, inXml); } else if (inXml3 ==NULL ) { // 如果有两个参数 Command.Format("exec %s '%s','%s'", ProcName, inXml, inXml2); } else Command.Format("exec %s '%s','%s','%s'", ProcName, inXml, inXml2,inXml3); // 创建Command对象 HRESULT hr = CmdObj.CreateCommand(m_Sess); if(FAILED(hr)) { return hr; } // 从Command对象中获得CommandText对象 hr = CmdObj.m_spCommand->QueryInterface(&pCommandText); if(FAILED(hr)) { return hr; } // 设置Command Text hr = pCommandText->SetCommandText(DBGUID_DEFAULT, A2OLE(Command)); if(FAILED(hr)) { TRACE("Failed to set command stream.\n"); return hr; } // 运行命令 hr = CmdObj.m_spCommand->Execute(NULL, IID_ISequentialStream, NULL, NULL, (IUnknown **) &pIXMLOutput ); if(FAILED(hr)) { TRACE("Failed to execute.\n"); return hr; } // 获取结果 CHAR szBuf[SQLBUFFERSIZE]; CHAR szTemp[SQLBUFFERSIZE] = ""; ULONG ulNumRead; CString sRet; memset(szBuf,0,sizeof(szBuf)); if(pIXMLOutput != NULL) { // 读取结果到szBuf中 while( ( hr = pIXMLOutput->Read( szBuf, sizeof(szBuf),&ulNumRead ) ) == S_OK ) { // 成功,添加到szTemp中 strcat(szTemp, szBuf); } // 进行UTF8转换 CString strUtf8 = szTemp; OutXml = DecodeFromUTF8(strUtf8); } else { TRACE("ERROR: No Output Stream Detected...\n"); return E_FAIL; } 网络协议分析 VC下使用Widows Screen media压缩技术实现屏幕录制。急急急! 如何实现关闭登录框,即关闭整个程序?? 提问关于动态库问题 有关GetLastError的一个很实用问题,请教大家!! 帮我看看这几行干什么用的? 怎么从字体的文件名"*.ttf"得到字体名? 在各个对话框间共享数据的问题 菜鸟的迷茫 在vc里单步调试c程序,遇到"printf"就要找printf.c文件,请问是怎么回事,如何解决? (MFC)问个用list control历遍显示xml中数据的问题 如何实现类似Windows XP安全中心那样知道病毒防护是否打开
楼主用的是 OLE DB 吧?我没有用过这个,因为比较复杂,为什么不用 ADO ?
CComPtr<ICommandProperties> pCommandProperties;
CComPtr<ICommandText> pCommandText;
CComPtr<ISequentialStream> pIXMLOutput; CCommand<CNoAccessor,CNoRowset> CmdObj;
USES_CONVERSION;
CString Command;
if(inXml == NULL)
{ // 没有参数
Command.Format("exec %s", ProcName);
}
else if(inXml2 == NULL)
{ // 如果有一个参数
Command.Format("exec %s '%s'", ProcName, inXml);
}
else if (inXml3 ==NULL )
{ // 如果有两个参数
Command.Format("exec %s '%s','%s'", ProcName, inXml, inXml2);
}
else
Command.Format("exec %s '%s','%s','%s'", ProcName, inXml, inXml2,inXml3);
// 创建Command对象
HRESULT hr = CmdObj.CreateCommand(m_Sess);
if(FAILED(hr))
{
return hr;
}
// 从Command对象中获得CommandText对象
hr = CmdObj.m_spCommand->QueryInterface(&pCommandText);
if(FAILED(hr))
{
return hr;
}
// 设置Command Text
hr = pCommandText->SetCommandText(DBGUID_DEFAULT, A2OLE(Command));
if(FAILED(hr))
{
TRACE("Failed to set command stream.\n");
return hr;
}
// 运行命令
hr = CmdObj.m_spCommand->Execute(NULL, IID_ISequentialStream, NULL, NULL, (IUnknown **) &pIXMLOutput );
if(FAILED(hr))
{
TRACE("Failed to execute.\n");
return hr;
}
// 获取结果
CHAR szBuf[SQLBUFFERSIZE];
CHAR szTemp[SQLBUFFERSIZE] = "";
ULONG ulNumRead;
CString sRet;
memset(szBuf,0,sizeof(szBuf));
if(pIXMLOutput != NULL)
{
// 读取结果到szBuf中
while( ( hr = pIXMLOutput->Read( szBuf, sizeof(szBuf),&ulNumRead ) ) == S_OK )
{
// 成功,添加到szTemp中
strcat(szTemp, szBuf);
}
// 进行UTF8转换
CString strUtf8 = szTemp;
OutXml = DecodeFromUTF8(strUtf8);
}
else
{
TRACE("ERROR: No Output Stream Detected...\n");
return E_FAIL;
}