Я получаю несколько строк в элемент управления списком из источника ODBC. Для простых SELECT, кажется, хорошо работает с атрибутом оператора SQL_SCROLLABLE. Как мне сделать это с помощью запроса UNION (с двумя вариантами выбора)?
Наиболее вероятным сервером будет MS SQL Server (вероятно, 2005). Код для C Win32 API.
Этот код устанавливает (как мне кажется,) курсор на стороне сервера, который подает данные в драйвер ODBC, который приблизительно соответствует позиционным выборкам SQLFetchScroll, который, в свою очередь, подает кэш для просмотра списка. (Иногда также используется SQL_FETCH_FIRST или SQL_FETCH_LAST):
SQLSetStmtAttr(hstmt1Fetch,
SQL_ATTR_CURSOR_SCROLLABLE,
(SQLPOINTER)SQL_SCROLLABLE,
SQL_IS_INTEGER);
SQLSetStmtAttr(hstmt1Fetch,
SQL_ATTR_CURSOR_SENSITIVITY,
(SQLPOINTER)SQL_INSENSITIVE,
SQL_IS_INTEGER);
...
retcode = SQLGetStmtAttr(hstmt1Fetch,
SQL_ATTR_ROW_NUMBER,
&CurrentRowNumber,
SQL_IS_UINTEGER,
NULL);
...
retcode = SQLFetchScroll(hstmt1Fetch, SQL_FETCH_ABSOLUTE, Position);
(Выше приведен фрагмент из рабочего кода для одного SELECT).
Это лучший способ сделать это? Учитывая, что мне нужно получить последнюю строку, чтобы получить количество строк и заполнить конечный буфер, есть ли лучший способ сделать это? (Могу ли я использовать только прокрутку вперед?)
Если да к вышесказанному, как мне добиться того же результата с помощью запроса UNION?
LATE EDIT: проблема с запросом объединения состоит в том, что фактически он вызывает только прокрутку вперед, что нарушает SQLFetchScroll (hstmt1Fetch, SQL_FETCH_ABSOLUTE, Position). Я подозреваю, что ответ: «Вы не можете». И это действительно означает изменение базы данных, чтобы включить либо представление, либо одну таблицу для замены UNION. Но я оставлю вопрос открытым, если что-то пропустил.