Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 正在执行:使用[dbName];exec sp_space与ADO C++;_C++_Sql Server_Adodb - Fatal编程技术网

C++ 正在执行:使用[dbName];exec sp_space与ADO C++;

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

我正在尝试使用以下查询确定完整backub的大小:

 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