C++ 正在执行:使用[dbName];exec sp_space与ADO C++;
我正在尝试使用以下查询确定完整backub的大小:C++ 正在执行:使用[dbName];exec sp_space与ADO C++;,c++,sql-server,adodb,C++,Sql Server,Adodb,我正在尝试使用以下查询确定完整backub的大小: use [someDtabase]; exec sp_spaceused 如果我在SSMS中运行它,它可以正常工作,但当我尝试在C++代码中重复它时,我会得到错误:“当对象关闭时不允许操作”。我的代码: std::wstring query = L"use [someDatabase]; exec sp_spaceused"; ADODB::_CommandPtr ptrCommand; ptrCommand.Cre
use [someDtabase]; exec sp_spaceused
如果我在SSMS中运行它,它可以正常工作,但当我尝试在C++代码中重复它时,我会得到错误:“当对象关闭时不允许操作”。我的代码:
std::wstring query = L"use [someDatabase]; exec sp_spaceused";
ADODB::_CommandPtr ptrCommand;
ptrCommand.CreateInstance( __uuidof( ADODB::Command ));
ptrCommand->ActiveConnection = m_ptrConnection;
ptrCommand->CommandText = _bstr_t( query.c_str() );
ptrCommand->CommandTimeout = timeout;
ADODB::_RecordsetPtr ptrRecordset = ptrCommand->Execute( NULL, NULL, ADODB::adCmdText );
if (!ptrRecordset || ptrRecordset->EndOfFile == VARIANT_TRUE) //<--an exception is thrown here
std::wstring query=L“使用[someDatabase];exec sp_spaceused”;
ADODB::_commandptrptrcommand;
CreateInstance(uuuidof(ADODB::Command));
ptrCommand->ActiveConnection=m_ptrConnection;
ptrCommand->CommandText=_bstr_t(query.c_str());
ptrCommand->CommandTimeout=超时;
ADODB::_recordsetptrptrrecordset=ptrcomand->Execute(NULL,NULL,ADODB::adCmdText);
如果通过ADO返回诸如“更改的数据库上下文”之类的消息时(!ptrRecordset | | ptrRecordset->EndOfFile==VARIANT_TRUE)/,则记录集将关闭、为空且没有字段。消息将位于连接错误集合中
您可以忽略已关闭/空的结果集,并使用RecordSet.NextRecordSet
方法移动到下一个结果集。请注意,sp_spaceused
返回2个结果集,因此您需要再次调用NextRecordSet
来处理第二个结果
注意
TDS消息(行数)以关闭/空记录集的形式返回(但没有错误收集消息),这就是为什么ADO经典应用程序经常使用SET NOCOUNT ON
的原因。健壮的数据访问代码应该消耗所有的结果集和消息,否则SQL异常可能会被检测出来。看起来很奇怪,在C++代码中包含了<代码>使用< /代码>,通常您的连接字符串将定义数据库给用户。您可以在数据库的范围内执行该过程:exec master.sys.sp\u spaceused;exec tempdb.sys.sp_spaceused代码>