SQLワイルドカードを使用してString.Formatを実行すると、Dapperクエリが中断する

c# dapper sql string-formatting

質問

私はDapperと文字列のフォーマットにちょっとした問題があります。関連するコードは次のとおりです。

string end_wildcard = @"
SELECT * FROM users
WHERE (first_name LIKE CONCAT(@search_term, '%') OR last_name LIKE CONCAT(@search_term, '%'));";

string both_wildcards = @"
SELECT * FROM users
WHERE (first_name LIKE CONCAT('%', @search_term, '%') OR last_name LIKE CONCAT('%', @search_term, '%'));";

string formatted = @"
SELECT * FROM users
WHERE (first_name LIKE {0} OR last_name LIKE {0});";

string use_end_only = @"CONCAT(@search_term, '%')";
string use_both = @"CONCAT('%', @search_term, '%')";

// if true, slower query due to not being able to use indices, but will allow searching inside strings 
bool allow_start_wildcards = false; 

string query = String.Format(formatted, allow_start_wildcards ? use_both : use_end_only);
string term = "blah"; // the term the user searched for

// Using Dapper
db.Query(end_wildcard, new{ search_term = term}); // Works and returns results
db.Query(both_wildcards, new{ search_term = term}); // Works and returns results
db.Query(query, new{ search_term = term}); // Returns nothing

最初の2つのクエリーでは、その中にワイルドカードを含むCONCATステートメントがストリングに焼き付けられ、完全に機能します。しかし、もし私がCONCAT文を取り出して、String.Formatを使ってどちらか一方を注入すると、結果は0になります。

その中で最も奇妙なのは、私がそれをデバッグし、それが使用する実際のクエリ文字列を取得し、それをMySQLに入れ、@search_termパラメータセットで実行し、一時停止中に結果を得ることです。コードを続けると0の結果が得られます。文字通り、異なる唯一のものは、あらかじめコンパイルされた文字列であり、もう1つはString.Formatを使用することです。

'@'と '%'はString.Formatによって特殊文字と見なされるのですか、それとも私はここでは見られませんか?書式設定された文字列は、文字通り2つの非書式文字列のうちの1つと等しいバイト単位であり、実際にMySQLに貼り付けることで、実際に書式設定された文字列から結果が得られます。 Dapperはちょうど最初の2つのうちの1つと同じであっても、2つで、3つではありません。

受け入れられた回答

あなたのquerytermが失敗している例で何を正確に示してください。私はここで問題を再現することはできません。コードを投稿したまま使用すると、 queryend_wildcardと同じで、 end_wildcard query 。ローカルテストリグ(いくつかの発明データがある)では、

connection.Query(end_wildcard, new { search_term = term }).Count().IsEqualTo(2);
connection.Query(both_wildcards, new { search_term = term }).Count().IsEqualTo(3);
connection.Query(query, new { search_term = term }).Count().IsEqualTo(2);

あなたが何か違う何かを見ているなら、私はそれがあなたの具体例に関連していなければならないと結論づけることができます。

しかし、具体的には:

'@'と '%'はString.Formatによって特殊文字と見なされるのですか、それとも私はここでは見られませんか?

いいえ。 string.Formatは、 {n} (整数n )、 {{ / }} (それぞれ{}エスケープシーケンス)のようなものしか気にしstring.Formatん。

基本的には、これに関連する何かをdapperが行っている可能性は低いと思いますが、失敗したときに表示されるように正確なqueryterm を表示すると助けになります。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ