我已从链接 here 下载 SqlMapper.cs 文件。
虽然我遇到了一些令人困惑的麻烦。每当我使用参数时,我的查询都返回空集合,即使我很确定我使用相同的字符串数据。
以下是一段用于提取数据的代码。
using (PhoenixConnection connection = new PhoenixConnection(Open: true))
{
//this example works, returns 1 token object
string queryWorks = @"Select AccountName, AccountToken from btsource.accounts
where AccountName = 'RekindledPhoenix'";
// replaces 'RekindledPhoenix' with a parameter, returns empty collection
string queryDoesnt = @"Select AccountName, AccountToken from btsource.accounts
where AccountName = @AccountName";
var tokenList = connection.Query<TokenRequest>(queryWorks);
var tokenList = connection.Query<TokenRequest>(queryDoesnt, new { AccountName = "RekindledPhoenix" });
return tokenList.FirstOrDefault();
}
这是我正在使用的课程......
public class TokenRequest
{
public string AccountName { get; set; } //`AccountName` VARCHAR(50) NOT NULL
public long AccountToken { get; set; } //`AccountToken` BIGINT(20) NOT NULL
}
这是我的PhoenixConnection对象中的包装函数。
public IEnumerable<T> Query<T>(string Query, dynamic Parameters = null)
{
return _connection.Query<T>(Query, (object)Parameters);
}
我试过了:
我可以缺少什么?
是否有一些用于参数的特殊设置?
使用原始MySqlConnection
参数可以更好地处理?
而非@
,但仍无法与Dapper一起使用。
我注意到Dapper中有特定的行使用正则表达式([@:]
)语句提取参数,但问号似乎被忽略了。我应该改变什么来给我预期的结果?
答案 0 :(得分:3)
我发现了这个问题。在使用原始MySqlConnection
对象执行查询后,它会引导我搜索为什么@
符号在我的任何语句中都不起作用。在过去我总是使用?
,所以这种行为对我来说很奇怪。
将以下@
符号更改为?
(具有近似行号):
第1863行:if (identity.sql.IndexOf("
? " + prop.Name, StringComparison.InvariantCultureIgnoreCase) < 0
第1831行:return parameters.Where(p => Regex.IsMatch(sql, "[
? :]" + p.Name + "([^a-zA-Z0-9_]+|$)", RegexOptions.IgnoreCase | RegexOptions.Multiline));
解决了我的问题!