理由はありますか
SELECT * FROM MyTable WHERE [_Items] LIKE '*SPI*'
OleDbAdapter.Fill(DataSet)
またはOleDbCommand.ExecuteReader()
?を含むレコードを返しません。
同じSQLをMSAccessで直接実行すると、期待されるレコードが返されます。また、同じコードで、SQLをに変更すると
SELECT * FROM MyTable
すべてのレコードが返されます。
理由はありますか
SELECT * FROM MyTable WHERE [_Items] LIKE '*SPI*'
OleDbAdapter.Fill(DataSet)
またはOleDbCommand.ExecuteReader()
?を含むレコードを返しません。
同じSQLをMSAccessで直接実行すると、期待されるレコードが返されます。また、同じコードで、SQLをに変更すると
SELECT * FROM MyTable
すべてのレコードが返されます。
に変更して、ワイルドカード文字をからに変更LIKE
してみてください。ALIKE
*
%
Access Database Engine(Jet、ACEなど)には2つのANSIクエリモードがあり、それぞれが異なるワイルドカード文字を使用しますLIKE
。
ANSI-89クエリモードは*
ANSI-92クエリモードは%
OLE DBは、常にANSI-92クエリモードを使用します。DAOは常にANSI-89クエリモードを使用します。アクセスUIは、どちらか一方を使用するように設定できます。
ただし、ALIKE
キーワードを使用する場合、ワイルドカード文字は常に%
ANSIクエリモードに関係ありません。
データ要素は正確に8文字の数字で構成されている必要があるというビジネスルールについて考えてみます。次のようにルールを実装したとします。
CREATE TABLE MyStuff
(
ID CHAR(8) NOT NULL,
CHECK (ID NOT LIKE '%[!0-9]%')
);
Accessのデータ型と制約はANSI-92クエリモードでのみ作成できる%
ため、ワイルドカード文字として使用することは避けられません。CHAR
CHECK
ただし、誰かが常にANS-89クエリモードを使用するDAOを使用してデータベースにアクセスする可能性があり、その%
文字は「特殊」文字ではなくリテラルと見なされ、次のコードが実行される可能性があります。
INSERT INTO MyStuff (ID) VALUES ('%[!0-9]%');
挿入は成功し、データの整合性が失われます:(
同じことは、ANSI-89クエリモードで作成された検証ルールLIKE
と*
、常にANSI-92クエリモードを使用するADOを使用して接続し、*
文字が存在してはならない場所に文字を挿入する人を使用*
することでも言えます。
私の知る限り、AccessデータベースへのアクセスにどのANSIクエリモードを使用するかを強制する方法はありません。したがって、ユーザーが選択したANSIクエリモードに関係なく、すべてのSQLが一貫して動作するようにコーディングする必要があると思います。
LIKE
上記の例で両方を使用してコーディングすることはそれほど難しくないことに注意してください。
CHECK (
ID NOT LIKE '%[!0-9]%'
AND ID NOT LIKE '*[!0-9]*'
)
...または実際にワイルドカードを完全に回避します。
CHECK (ID LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')
ただし、使用ALIKE
すると、コードの冗長性が低くなります。つまり、人間の読者にとって使いやすく、したがって保守が容易になります。
また、SQL標準に準拠するSQL製品に移植するときが来たら、移植もうまくいきます。つまり、キーワードをにALIKE
変換するだけで十分です。特定のSQL述語を解析する場合、テキストリテラル内の文字の複数のインスタンスをすべて検索するよりも、1つのキーワードを検索する方がはるかに簡単です。「ポータブル」は「コードが「そのまま」実行される」という意味ではないことに注意してください。むしろ、プラットフォーム間でコードを移動するのがいかに簡単かを示す尺度です(また、同じ製品のバージョン間を移動することはポートです。たとえば、ユーザーレベルのセキュリティが機能しなくなったため、Jet 4.0からACEへの移動はポートであり、値は並べ替えられます。別の方法など)。ALIKE
LIKE
LIKE
*
DECIMAL
OLE DBを使用する場合は、ワイルドカード検索*
をそのままに変更し%
てください。%
SELECT * FROM MyTable WHERE [_Items] LIKE '%SPI%'
ワイルドカード文字(*)を%に変換してみてください
これで問題が解決するはずです。
うわあ、これはうまくいきます!どうもありがとう。
に置き換える必要がありましnot like criteria
たnot alike criteria
。
私は自分の「ストーリー」を共有して、他の人がこの投稿を見つけやすくし、2時間の検索から彼らを救うのを助けています。
Excel 95-97xlsファイルをAccess2010データベースにリンクし、実行しcreate table
てinsert into
クエリを実行してすべてのデータをデータベースにインポートしましたが、奇妙な理由で、selectクエリで入力した文字列が見つかりませんでした。
私は試しましたがnot like "something"
、not like "%something%"
成功しませんでした-単に機能しませんでした。
L