【问题标题】:executing: use [dbName] ; exec sp_spaceused with ADO C++执行:使用 [dbName] ; exec sp_space 与 ADO C++ 一起使用
【发布时间】:2021-02-26 05:44:12
【问题描述】:

我正在尝试使用查询来确定完整备份的大小:

 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

我猜问题出在“使用 [someDtabase];”并且记录集总是为它关闭

【问题讨论】:

  • 在 C++ 代码中包含 USE 似乎很奇怪,通常您的连接字符串将定义要使用的数据库。
  • 代替USE db,您可以在数据库范围内执行该过程:exec master.sys.sp_spaceused; exec tempdb.sys.sp_spaceused;

标签: c++ sql-server adodb


【解决方案1】:

当通过 ADO 返回诸如“更改的数据库上下文”之类的消息时,RecordSet 将被关闭、为空且没有字段。消息将在连接Errors 集合中。

您可以使用RecordSet.NextRecordSet 方法忽略关闭/空结果集并移至下一个。请注意,sp_spaceused 无论如何都会返回 2 个结果集,因此您需要再次调用 NextRecordSet 来处理第二个结果。

注意DONE_IN_PROC TDS 消息(行计数)同样作为关闭/空记录集返回(但没有错误收集消息),这就是为什么SET NOCOUNT ON 经常用于 ADO 经典应用程序的原因。健壮的数据访问代码应该使用所有结果集和消息,否则 SQL 异常可能无法检测到。

【讨论】:

    猜你喜欢
    • 2010-12-18
    • 2015-06-25
    • 1970-01-01
    • 2013-11-18
    • 2012-09-09
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    相关资源
    最近更新 更多