C ++, как заставить два оператора SQL работать с OLEDB? - PullRequest
1 голос
/ 20 января 2012

У меня есть следующий оператор 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());

Два примечания:

  1. Обработка ошибок для краткости опущена
  2. RowHandles реализует концепцию RAII для HROW *

В любом случае мне не удалось выполнить два оператора SQL.Происходит следующее: spCommandText->Execute возвращает S_OK, но устанавливает spRowset в NULL.

Если я выполняю тот же spCommandText->Execute во второй раз (путем перемещения указателя инструкций во время сеанса отладки), затем возвращается действительный указатель IRowset - я успешно получаю правильную информацию о столбце, используя его.Но spRowset->GetNextRows устанавливает rowCount в 0 и возвращает DB_S_ENDOFROWSET - не повезло.

Код работает нормально, когда я выполняю одну инструкцию SQL.

Что я делаю не так?

Спасибо.

1 Ответ

0 голосов
/ 20 января 2012

Клиент должен разделить команды sql - isql делает это на;то есть вы запрашиваете две команды: use и select.
Таким образом, исправление состоит в том, чтобы выполнить две команды с помощью отдельных наборов CreateCommands и выполнить.

Также обратите внимание, что в этом случае вы можете выполнять команды какодин оператор 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
...