3

DelphiXE2のADOデータセットにフィルターを適用しようとすると問題が発生します...

Filter := ' [Name] like ''%john'' ';

例外が発生します。

Project Test.exe raised exception class EOleException with message 
'Arguments are of the wrong type, are out of acceptable range, 
or are in conflict with one another'. Process stopped. 

しかし、使用する場合:

Filter := ' [Name] like ''john%'' '

それはうまくいきます!

なぜ?

4

3 に答える 3

3

演算子は、次のいずれかになります。= <> <=> = <> LIKE LIKE演算子を使用する場合は、*または%ワイルドカードを文字列の最後の文字または最初と最後の文字として使用することもできます。文字列内。

http://www.devguru.com/technologies/ado/quickref/recordset_filter.html

イベントOnFilterRecordでフィルターをキャッチできます。

procedure TForm1.ADODataSet1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
var
  iPos: Integer;
begin
  iPos:= pos('john',ADODataSet1name.AsString);
  if (iPos>0) and
     (iPos = length(ADODataSet1name.AsString)-3) then
  begin
    Accept:= True;
  end
  else
  begin
    Accept:= False;
  end;
end;

また

function TForm1.IsLastCriteria(AText: String): Boolean;
var
  iPos: Integer;
begin
  iPos:= pos(AText,ADODataSet1name.AsString);
  Result:= (iPos>0) and
           (iPos = length(ADODataSet1name.AsString)-length(AText)-1);
end;

procedure TForm1.ADODataSet1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
  Accept:= IsLastCriteria('john');
end;
于 2012-09-12T09:04:23.657 に答える
2

なので。それでも、 http://www.catb.org/esr/faqs/smart-questions.html#bepreciseを読んで、それに応じて環境について説明してください。

  • データベースサーバーとは何ですか?
  • MDAC / ADOコンポーネントのバージョンは何ですか?
  • クエリは何ですか?
  • SQLの名前列タイプとは何ですか?

あなたはコメントを「アップ」しています、それはいいですね。しかし、あなたは質問に答えません。そして、それは良くありません。私たちはESPerではありません。あなたの心を読むことはできません。

上記のコメントにいくつかの提案を入れました。それらを試しましたか?彼らは働きましたか?それらを引用するには:

  1. たぶん、ADO/MDACを2.8sp1バージョンに更新できます。参照されているMSDNKB記事は、2.7バージョンまでのMDACに適用するように指示されています。たぶん2.8sp1にはもうその制限はありません。
  2. 名前の最後の4文字を別の列にコピーするなど、データサーバー固有のトリックを使用できるかもしれません。
  3. たぶん、その条件をSQL SELECT WHERE句に移動して、クエリを再度開くことができます。
  4. TBDEDataSet.OnFilterRecordのようなイベントハンドラーがあるかもしれません

4つの回避策があり、それらを試しなかったか、結果を報告しませんでした。よくない。

  • アイデア#1は自明です
  • アイデア#3は、@ SertacAkyuzによって可能な限り詳細に説明されており、プログラムに関する情報が不足しています。
  • アイデア#4は@Ravaut123によって詳述されました
  • アイデア#2の概要を以下に示します

「ADOデータベース」がMicrosoftAccessによってサポートされていると仮定し、http ://www.databasedev.co.uk/access-sql-string-functions.htmlに従って...またはMS SQLを使用してhttp://に従ってmsdn.microsoft.com/en-us/library/ms177532.aspx ...または...

Query.SQL.Text:='select Right(Name、4)as name_tail、 * from table where ...'

クエリに追加された追加の列を参照してください。そこの「ジョン」の長さは4です。

このようなクエリでは、次のフィルタリング条件が同等になります。

  • Filter:='[Name] like''%john''';
  • フィルタ:='[name_tail] =''john''';

ただし、一部の行で[名前]列が4文字より短い場合、RIGHT関数が何をするのかわかりません。結果を切り捨てるか、エラーをスローしてクエリを中止する可能性があります。後者は、実際のデータによっては、次のように4つの長さにスペースを埋めることで軽減できる可能性があります。

LTrim(Right('    ' || Name, 4)) as name_tail

あなただけがあなたの環境の詳細を知っているので、それはあなたがテストするためのものです。

于 2012-09-12T11:03:04.567 に答える
2

この質問に対する最も簡単な答えはコメントで言及されました。パーセント記号の代わりにアスタリスクを使用した場合、すべてがうまく機能しますFilter:='[Name] like''* john''';

于 2014-06-19T11:40:14.980 に答える