0

TADOQueryからいくつかのレコードをフィルタリングしようとしています。フィルター処理されたプロパティをtrueに設定し、フィルターをfield ='value'に設定すると、すべて正常に機能します。このフィルターを追加して動的に構築したい

<space>AND field='value'

常に真の値になり、1=1でうまくいくと思いました。したがって、デフォルトのフィルターとして1 = 1を使用AND field='value'し、必要に応じて追加します。

ただし、これは機能しません。エラーメッセージは次のとおりです。

引数のタイプが間違っているか、許容範囲外であるか、または互いに競合しています。

このフィルターの用途の広い常に真の表現として何を使用できるか教えていただけますか?

4

3 に答える 3

1

言うまでもないことですが、これが機能するかどうかはOLEDBプロバイダーによって異なります。既存のレコードセットにフィルターを設定すると、別のOLE DBインターフェイス(正しく覚えている場合はIViewFilter)を経由することになります。したがって、フィルターがSQLステートメントのWHERE句で機能する場合でも、必ずしもフィルターとして機能することを意味するわけではありません。設定したフィルターは、最終的にコンポーネントピースに解析されてから、OLEDBインターフェイスに渡されます。プロバイダーの実装は、「定数=定数」の形式のフィルターを予期していない可能性があります。回避策として、SQLステートメントのWHERE句ですべてを設定してみてください。

于 2010-01-12T14:32:10.283 に答える
1

何かをフィルタリングしていない場合は「Filtered」プロパティをFalseに設定し、結果セットをフィルタリングする場合はTrueと条件を設定する必要があります。

ただし、データベースに何が送信されているかを常に正確に把握できるように、正しいSQLプロパティを動的に構築します(プログラムが必要なレコードのみを確​​実に受信できるようにします)。

于 2010-01-12T14:33:44.400 に答える
1

1 = 1のトリックは、クエリのwhere句では正常に機能しますが、フィルター処理されたプロパティでは機能しません。フィルタを無効にする場合は、filteredをfalseに設定すると、すべてのレコードが返されます。

フィルタリングの問題は、クライアント側で行われることです。SQL Serverなどのデータベースエンジンを使用していて、フィルタリングするレコードのセットが大きいと予想される場合は、SQLクエリを変更することで、データベースサーバーが要求されたレコードのみを返すことができるようになります。最初にTAdoQueryを閉じ、SQLを変更してから、再度開くことを忘れないでください。

データセット全体(大きなデータセットに使用)を返さないようにするために使用するトリックは、表示するレコードの最大数を検討し、TOPSQL構文を使用して表示するレコードの数より1つ多い数を返すことです'n '...その数に達した場合は、n-1を超えるレコードが返されたことをユーザーに通知し、検索/フィルター基準を調整します。

于 2010-01-12T17:33:30.900 に答える