Access DB に対して簡単なステートメントを実行して、レコードを検索しようとしています。
記録のデータ検証はひどいもので、サニタイズできませんでした。つまり、そのまま保存する必要があります。
空白とハイフン文字を削除した文字列を検索できるようにする必要があります。次のステートメントは、Access 2010 ダイレクトで機能します。
select * from dummy where Replace(Replace([data1],' ',''),'-','') = 'ABCD1234';
PHP 経由で ODBC 接続から実行すると、実行されません。次のエラーが発生します。
SQL error: [Microsoft][ODBC Microsoft Access Driver] Undefined function 'Replace' in expression., SQL state 37000 in SQLExecDirect
関数を実行するデータベースでクエリを作成し、その値を間接的に検索しようとすると、同じエラーが発生します。
select * from dummy_indirect where Expr1 = 'ABCD1234';
存在する両方の ODBC ドライバーを使用しようとしました。ODBCJR32.dll (2010 年 3 月 22 日) および ACEODBC.dll (2007 年 2 月 18 日)。私の知る限り、これらは完全な Access 2010 および Access 2010 データベース エンジンと共にインストールされているため、最新の状態になっているはずです。
このエラーを回避して同じ効果を得る方法についてのアイデアは大歓迎です。データベースの方法、形状、形式を変更することはできませんのでご注意ください。その間接クエリは、元の DB からリンクされた元のテーブルを持つ別の mdb ファイルで作成されました。
* アップデート *
OleDB は実際には何も影響しませんでした。
$dsn= "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\dummy.mdb;";
私はそれを Web バックエンドとしても使用しようとはしていません。私はサドマゾヒストではありません。
Access をバックエンドとして使用する、サポートしなければならないレガシー システムがあります。より新しいシステムに統合する必要がある他の古いシステムからデータがそこに取り込まれます。したがって、レガシー システムをサポートするサーバー上で実行される Apache/PHP を使用した API の作成。
英数字のケース識別子を持つテーブルを検索して、一意でジェネレータに関連付けられた数値識別子を取得できるようにする必要があります (アクセスの自動番号)。ユーザーは何年もそれをゴミ箱として使用してきました (散発的な表記による一貫性のないデータ入力) ので、私が持っている唯一の解決策は、フィールド値と検索値の両方から英数字以外のすべてを取り除き、それに対して LIKE 比較を実行しようとすることです。
アクセスがサポートされている replace() でない場合、同じ種類の比較を行うために使用できる ODBC 互換関数は何ですか?