TADOTableでLocateを使ってバイナリ型を含む項目検索をするには?

解決


クロッカス  2013-07-02 18:56:56  No: 44788

DBをParadox7からAccess2010に移行したため、Accessの仕様である
大文字・小文字、半角・全角、ひらがな・カタカナを区別しないことで 
困っています。
        
登録されているデータの中で影響があるのは、半角と全角の区別が
出来ないデータについてです。
        
(例)        
<Table1> 
Key1  Key2  Key3  データ1  データ2
1     1      ABC      aaa      bbb
1     1      ABc      ddd      eee
1     1      Abc      ddd      eee
        
<Table2>        
Key1  Key2  Key3  データ1  データ2
1     1      ABC      aaa      bbb
1     1      ABc      ddd      eee
1     1      Abc      ddd      eee
        
        
上記のようなデータ構成のテーブルを読むため、TADOTableのLocate 
を使用して、そのキーが存在するかどうかを判別しています
        
例のテーブルは、「Key3」をテキスト型で持っていたのですが、
Accessのクエリで以下のALTER文を実行して、大文字・小文字を 
区別できるバイナリ型に項目の型を変更しました。        
        
   ALTER TABLE Table1 ALTER COLUMN Key3 VARBINARY(6);
   ALTER TABLE Table2 ALTER COLUMN Key3 VARBINARY(6);
        
        
この対応で登録は可能となったのですが、そのレコードを特定するために
Locateを使用している箇所で以下のエラーが発生します。
        
ret := Table2.Locate('Key1;Key2,Key3',        
                           VarArrayOf(Table1['Key1'],Table1['Key2'],Table1['Key3']]),
                           [loCaseInsensitive]);        
        
エラーメッセージ:        
    「複数ステップの OLE DB の操作でエラーが発生しました。 
      各OLE DBの状態の値を確認してください。作業は終了しませんでした。」
        
        
VarArrayOfで囲まれた「Table1['Key3']」の箇所を以下のように変更してもエラーが発生しました。
        
Table1['Key3'].Values       
  →エラーメッセージ「バリアントに対する演算が正しくありません」が表示される。 
        
Table1.FieldByName('Key3').Value 
  →エラーメッセージ「複数ステップの OLE DB の操作でエラーが発生しました。」が表示される。
        
TADOTableでバイナリ型を含むキー項目に対して、Locateでエラーなく処理するには 
どのようにすればよろしいでしょうか? 
        
以上、よろしくお願いします。


クロッカス  2013-07-07 22:15:30  No: 44789

自己解決しましたので報告します。

以下の方法が正解かは分かりませんが、今のところ正常に動作しています。

ポイントは3つでした。
1.ADOTableコンポーネントプロパティのCursorLocationを"clUseServer"にする。
    (デフォルト設定は"clUseClient")

2.Locateで使用するバイナリ型の引数を文字列型に変換し、シングルクォーテーションで
    くくってセットする

例)
var
  V1 : OleVariant;
  S1 : String;
begin
  ・
  ・
  ・
  Table2.CursorLocation := clUseServer;

  V1 := Table1['Key3'];    //OleVariant型に一旦セット
  S1 := V1;                //String型にセット

  ret := Table2.Locate('Key1;Key2,Key3',
                       VarArrayOf(Table1['Key1'],Table1['Key2'],''''+S1+'''']),
                       [loCaseInsensitive]);

3.バイナリ型の項目へセットする場合は、Char型に変換する

例2)
var
  C1 : array[0..6] of Char;       //Char型配列
begin
  ・
  ・
  ・
  strPCopy(C1,TrimRight(text.Fields[0]));
  Table1.FieldByName('Key3').AsString := C1;
  ・
  ・
  ・

以上です。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加