У меня есть следующий оператор 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
реализует концепцию RAII для HROW *
В любом случае мне не удалось выполнить два оператора SQL.Происходит следующее: spCommandText->Execute
возвращает S_OK
, но устанавливает spRowset
в NULL
.
Если я выполняю тот же spCommandText->Execute
во второй раз (путем перемещения указателя инструкций во время сеанса отладки), затем возвращается действительный указатель IRowset
- я успешно получаю правильную информацию о столбце, используя его.Но spRowset->GetNextRows
устанавливает rowCount
в 0
и возвращает DB_S_ENDOFROWSET
- не повезло.
Код работает нормально, когда я выполняю одну инструкцию SQL.
Что я делаю не так?
Спасибо.