我有以下 SQL 语句:
USE "ws_results_db_2011_09_11_09_06_24";SELECT table_name FROM INFORMATION_SCHEMA.Tables WHERE table_name like 'NET_%_STAT' order by table_name
我正在使用以下 C++ 代码来执行它:
IDBCreateCommandPtr spDBCreateCommand = GetTheDBCreateCommandPointer();
ICommandTextPtr spCommandText;
spDBCreateCommand->CreateCommand(NULL, IID_ICommandText, reinterpret_cast<IUnknown **>(&spCommandText));
spCommandText->SetCommandText(DBGUID_SQL, GetTheQueryText());
IRowsetPtr spRowset;
spCommandText->Execute(NULL, IID_IRowset, NULL, NULL, reinterpret_cast<IUnknown **>(&spRowset));
RowHandles hRows(spRowset, 0);
ULONG rowCount;
ULONG maxRowCount = 1;
spRowset->GetNextRows(DB_NULL_HCHAPTER, 0, maxRowCount, &rowCount, hRows.get_addr());
两个注意事项:
- 为简洁起见省略了错误处理
RowHandles
实现了HROW *
的 RAII 概念
反正我这两条sql语句都执行失败了。 spCommandText->Execute
返回 S_OK
,但将 spRowset
设置为 NULL
。
如果我第二次执行相同的 spCommandText->Execute
(通过在调试 session 期间向后移动指令指针),则会返回一个有效的 IRowset
指针 -我使用它成功地获得了正确的列信息。但是 spRowset->GetNextRows
将 rowCount
设置为 0
并返回 DB_S_ENDOFROWSET
- 运气不好。
当我执行单个 SQL 语句时,代码运行良好。
我做错了什么?
谢谢。
最佳答案
由客户端来拆分 sql 命令 - isql 在 ;即您要求使用和选择两个命令。
因此解决方法是通过单独的 CreateCommand 集执行这两个命令并执行。
另请注意,在这种情况下,您可以将命令作为一个 SQL 语句来执行
SELECT table_name FROM ws_results_db_2011_09_11_09_06_24.INFORMATION_SCHEMA.Tables
WHERE table_name like 'NET_%_STAT'
order by table_name
关于c++ 如何使两条语句的 sql 与 OLEDB 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8944096/