1

我正在从 ODBC 源将多行检索到列表视图控件中。对于简单的 SELECT,它似乎可以很好地与 SQL_SCROLLABLE 的语句属性一起使用。如何使用 UNION 查询(​​有两个选择)执行此操作?

最有可能的服务器是 MS SQL Server(可能是 2005 年)。Win32 API 的代码是 C。

这段代码设置(我认为是)一个服务器端游标,它将数据提供给 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,
                         无效的);
...
retcode = SQLFetchScroll(hstmt1Fetch,SQL_FETCH_ABSOLUTE,位置);

(上面是单个 SELECT 的工作代码的片段)。

这是最好的方法吗?鉴于我需要检索最后一行以获取行数并填充结束缓冲区,有没有更好的方法呢?(我可以只使用向前滚动吗?)

假设以上是肯定的,我如何使用 UNION 查询获得相同的结果?

后期编辑:联合查询的问题在于它有效地强制仅向前滚动,这会破坏 SQLFetchScroll(hstmt1Fetch,SQL_FETCH_ABSOLUTE,位置)。答案是我怀疑:“你不能”。这实际上意味着重新设计数据库以包含视图或单个表来替换 UNION。但如果我错过了什么,我会留下这个问题。

4

3 回答 3

1

你不能在为你进行联合查询的数据库服务器上定义一个视图,所以从客户端代码来看,它看起来就像一个单一的选择?

如果你不能,你能不能把联合操作作为你选择的一部分,例如

select some_fields from table1
union
select same_fields from table2

并将结果视为单个结果集?

于 2008-09-19T04:25:10.653 回答
0

如果问题只是需要获取最后一行来获取行数并缓存最后几行(我假设如果选择中有一百万个项目,那么您没有将所有项目都填充到下拉列表中)那么您也许可以利用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 

只获取您需要显示/缓存的行

但认真的人,如果您从一百万行表中选择项目,您可能需要考虑不同的机制

祝你好运!

于 2008-09-28T14:57:44.423 回答
0

您是否尝试过使用union来制作派生表?

select * from 
(select field1, field from table1
union all
slect field1, filed2 from table2) a
于 2008-09-28T16:53:34.770 回答