5

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 互換関数は何ですか?

4

2 に答える 2

5

要約すると、Replace()クエリが Access アプリケーション セッション内から実行されない限り、Access db エンジンは関数を認識しません。Access の外部から試行すると、「未定義の関数」というエラー メッセージが表示されます。接続方法をODBCからOleDbに切り替えることでエラーを回避することはできません。Replace()また、別のクエリ (同じまたは別の Access データベース内) にエンジンを隠し、そのクエリをメイン クエリのデータ ソースとして使用することで、エンジンをだまして使用させることもできません。

この動作は、Access のサンドボックス モードによって決まります。そのリンクされたページには、デフォルトのサンドボックス モードで使用できる機能のリストが含まれています。このページでは、サンドボックス モードを変更する方法についても説明しています。どうしてもReplace()クエリを利用できる必要がある場合は、最も低い設定 (0) で可能になるでしょう。ただし、そうすることはお勧めしません。自分でやったことがないので、結果についてはわかりません。

の代替についてReplace()は、検索している値の変動性について知っておくと役立ちます。スペースまたはダッシュ文字が 1 つまたはいくつかの一貫した位置にしか現れない場合は、式を使用してパターン マッチを実行できますLike。たとえば、検索フィールドの値が 4 つの文字、オプションのスペースまたはダッシュ、その後に続く 4 つの数字で構成される場合、次のWHEREような句は「ABCD1234」のバリエーションに対して機能するはずです。

SELECT * FROM dummy
WHERE
       data1 = 'ABCD1234'
    OR data1 Like 'ABCD[- ]1234';

別の可能性は、値のリストと比較することです。

SELECT * FROM dummy
WHERE
       data1 IN ('ABCD1234','ABCD 1234','ABCD-1234');

ただし、検索フィールドの値に、文字列内の任意の位置に任意の数のスペースまたはダッシュを含めることができる場合、そのアプローチは適切ではありません。そして、クエリタスクを簡単にするための何らかの方法が本当に難しいと思います:

  1. 元の Access データベースを変更することは一切禁止されているため、保存された値を消去することはできません。おそらく、新しい Access データベースを作成し、データをインポートして、代わりにクリーンアップすることができます。
  2. 元の Access データベースを SQL Server のリンク サーバーとして設定し、クエリを作成して SQL Server の機能を利用します。
  3. 降伏。:-( より大きなデータ セットを PHP クライアント コードに取り込み、使用する行と無視する行を評価します。
于 2012-09-22T14:38:00.837 に答える
-2

ODBC と制約でこれを実行できるかどうかはわかりません。MS Access ドライバーには制限があります(設計上、MS はバックエンドに SQL Server を使用することを望んでいます)。

OLEDBは使えますか?それはオプションかもしれません。

于 2012-09-21T21:17:42.303 に答える