Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用SQL通配符格式化导致Dapper查询中断_C#_Sql_String Formatting_Dapper - Fatal编程技术网

C# 使用SQL通配符格式化导致Dapper查询中断

C# 使用SQL通配符格式化导致Dapper查询中断,c#,sql,string-formatting,dapper,C#,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 CONCA

我在简洁和字符串格式方面遇到了一些奇怪的问题。以下是相关代码:

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
前两个查询(其中包含通配符的CONCAT语句被烘焙到字符串中)工作得非常好。但是,如果我取出CONCAT语句并使用String.Format插入其中一个语句,则得到0个结果

最奇怪的是,我可以调试它,获取它使用的实际查询字符串,将其放入MySQL并使用@search_term参数集运行它,并在暂停时获得结果。让代码继续,我得到0个结果。字面上唯一不同的是一个是预编译的字符串,另一个使用string.Format


“@”和“%”是否被String.Format视为特殊字符,或者是我在这里没有看到的其他字符?格式化字符串实际上是逐字节的,等于两个非格式化字符串中的一个,同样,将其粘贴到MySQL中实际上会给出格式化字符串的结果。Dapper似乎只喜欢两个,而不喜欢第三个,即使它正好等于前两个中的一个。

请指出在失败的示例中,您的
查询和
术语是什么。我不能在这里复制任何问题。如果我使用发布的代码,
query
end\u通配符
相同,并且:它工作正常。在当地的试验台上(有一些虚构的数据),我有:

如果你看到的是不同的东西,我只能得出结论,它必须与你的具体例子有关

但具体来说:

“@”和“%”是否被String.Format视为特殊字符,或者是我在这里没有看到的其他字符

没有
string.Format
只关心
{n}
(对于整数
n
)和
{{
/
}
(分别是
{
}
的转义序列)


基本上,我发现dapper不太可能做任何与此相关的事情,但是显示您的确切的
查询
术语
,当它们出现故障时会有所帮助。

嗯,这很奇怪。你完全正确。没有什么问题。计算机一夜之间重启了,今天早上,一切都很正常。我认为这只是VS被某种方式破坏的问题之一。每隔几天,我的WebAPI项目就会发现它缺少对SQLite的引用,尽管在我的项目中根本找不到。顺便说一下,谢谢你衣冠楚楚。“这太棒了!”克里斯今天早些时候推出了一个新版本
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);