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でエラーなく処理するには
どのようにすればよろしいでしょうか?
以上、よろしくお願いします。
自己解決しましたので報告します。
以下の方法が正解かは分かりませんが、今のところ正常に動作しています。
ポイントは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;
・
・
・
以上です。
ツイート | ![]() |