参数不适用于Dapper.Net

时间:2013-07-28 05:57:27

标签: c# mysql .net dapper

我已从链接 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);
}

我试过了:

  • 仔细检查mysql表名和值
  • 更改包装以使用除动态之外的任何东西(不起作用)
  • 验证连接 打开
  • 原始mysqlConnection对象,commandtext等

我可以缺少什么

是否有一些用于参数的特殊设置?

编辑:

使用原始MySqlConnection参数可以更好地处理?而非@,但仍无法与Dapper一起使用。

我注意到Dapper中有特定的行使用正则表达式([@:])语句提取参数,但问号似乎被忽略了。我应该改变什么来给我预期的结果?

1 个答案:

答案 0 :(得分:3)

我发现了这个问题。在使用原始MySqlConnection对象执行查询后,它会引导我搜索为什么@符号在我的任何语句中都不起作用。在过去我总是使用?,所以这种行为对我来说很奇怪。

更改SqlMapper.cs

将以下@符号更改为? (具有近似行号)

第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));

解决了我的问题!