ODBC ソースからリストビュー コントロールに複数の行を取得しています。単純な SELECT の場合、SQL_SCROLLABLE のステートメント属性でうまく機能するようです。UNION クエリ (2 つの選択) でこれを行うにはどうすればよいですか?
最も可能性の高いサーバーは、MS SQL Server (おそらく 2005) です。Win32 API のコードは C です。
このコードは、(私が思うに) SQLFetchScroll の位置フェッチにほぼ対応する ODBC ドライバーにデータをフィードするサーバー側カーソルを設定します。これは、リストビューのキャッシュをフィードします。(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, Position);
(上記は、単一の SELECT の作業コードの一部です)。
これが最善の方法ですか?行数を取得して終了バッファにデータを入力するために最後の行を取得する必要があるとすれば、それを行うより良い方法はありますか? (順方向スクロールだけでいいの?)
上記に当てはまると仮定すると、UNION クエリで同じ結果を得るにはどうすればよいですか?
後期編集: ユニオン クエリの問題は、事実上、SQLFetchScroll(hstmt1Fetch, SQL_FETCH_ABSOLUTE, Position) を壊す前方スクロールのみを強制することです。答えは、「できない」です。そして、それは実際には、DB を再設計して、UNION を置き換えるビューまたは単一のテーブルを含めることを意味します。しかし、何かを見逃した場合に備えて、質問を開いたままにします。