Получить несколько строк из источника ODBC с помощью запроса UNION - PullRequest
1 голос
/ 19 сентября 2008

Я получаю несколько строк в элемент управления списком из источника 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. Но я оставлю вопрос открытым, если что-то пропустил.

Ответы [ 3 ]

1 голос
/ 19 сентября 2008

не можете ли вы определить представление на сервере БД, которое выполняет запрос объединения, поэтому из клиентского кода это выглядит как один выбор?

если вы не можете, вы можете просто выполнить операцию объединения как часть вашего выбора, например,

select some_fields from table1
union
select same_fields from table2

и рассматривать результат как единый набор результатов?

0 голосов
/ 28 сентября 2008

Вы пытались использовать union для создания производной таблицы?

select * from 
(select field1, field from table1
union all
slect field1, filed2 from table2) a
0 голосов
/ 28 сентября 2008

Если проблема заключается только в том, чтобы получить последнюю строку, чтобы получить количество строк, и кэшировать последние несколько строк (я предполагаю, что если в выборке есть миллион элементов, вы не заполняете раскрывающийся список всеми из них) тогда вы сможете воспользоваться функцией ROW_NUMBER() SQL Server 2005

Вы могли бы:

select count(*) 
from (select blah UNION select blah) 

чтобы получить количество строк.

Тогда:

select ROW_NUMBER() as rownum,blah 
from (select blah UNION select blah) 
where rownum between minrow and maxrow 

, чтобы просто извлечь строки, которые нужно отобразить / кешировать

Если серьезно, ребята, если вы выбираете элементы из таблицы с миллионами строк, вы можете рассмотреть другой механизм

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...