1

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 を置き換えるビューまたは単一のテーブルを含めることを意味します。しかし、何かを見逃した場合に備えて、質問を開いたままにします。

4

3 に答える 3

1

ユニオンクエリを実行するビューをdbサーバーで定義できないので、クライアントコードからは単一の選択のように見えますか?

できない場合は、選択の一部としてユニオン操作を発行できますか。

select some_fields from table1
union
select same_fields from table2

結果を単一の結果セットとして扱いますか?

于 2008-09-19T04:25:10.653 に答える
0

を使っunionて派生テーブルを作ってみましたか?

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

行数を取得するために最後の行を取得し、最後の数行をキャッシュするだけで問題が解決しない場合 (選択項目に 100 万個の項目があり、ドロップリストにすべての項目を入力していないと仮定します) 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 に答える