我正在从 ODBC 源中将多行检索到 ListView 控件中。对于简单的 SELECT,它似乎与 SQL_SCROLLABLE 的语句属性配合得很好。我如何使用 UNION 查询(有两个选择)执行此操作?
最有可能的服务器是 MS SQL Server(可能是 2005)。 Win32 API 的代码是 C。
此代码设置(我认为是)一个服务器端游标,它将数据馈送到 ODBC 驱动程序,大致对应于 SQLFetchScroll 的位置提取,而后者又为 ListView 馈送缓存。 (有时使用 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 查询获得相同的结果?
后期编辑: union 查询的问题在于它有效地强制只向前滚动,这会破坏 SQLFetchScroll(hstmt1Fetch, SQL_FETCH_ABSOLUTE, Position)。我怀疑答案是:“你不能”。这实际上意味着重新设计数据库以包含一个 View 或一个表来替换 UNION。但我会留下这个问题以防万一我遗漏了什么。
最佳答案
你能不能在数据库服务器上定义一个为你做 union 查询的 View ,这样从客户端代码来看它就像一个单一的选择?
如果你不能,你能不能把 union 操作作为你选择的一部分,例如
select some_fields from table1
union
select same_fields from table2
并将结果视为单个结果集?
关于sql - 使用 UNION 查询从 ODBC 源中检索多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/99468/