【问题标题】:Dapper mapping String parameter as AnsiStringDapper 将 String 参数映射为 AnsiString
【发布时间】:2014-05-08 09:01:51
【问题描述】:

我需要将参数传递给 SQL 语句,使用 Firebird ADO 一切正常,但使用 InterBase ADO 时出现问题。 我的代码:

result = conn.Query<DestClass>(sqlCmd, new
{
  stringParam = stringVal,
  intParam1 = intVal1,
  intParam2 = intVal2
}).Single();

有了FormatException,但是当我使用DynamicParameters 定义参数并为stringParam 设置DbType.AnsiString 时,SQL 运行良好。但是当我需要传递字符串并且我不想在所有地方都更改时,我的代码中有很多地方。

然后发现可以用Dapper.SqlMapper.AddTypeMap(typeof(String), DbType.AnsiString); 但我不能。我有Common Language Runtime detected an invalid program.

如何解决这个问题?

编辑

看起来问题在 Dapper v1.22 中得到了解决。

【问题讨论】:

    标签: c# ado dapper interbase


    【解决方案1】:

    有一个建议是增加表单的汇编级属性:

    [assembly:SomeName(blah)]
    

    这将控制来自该程序集的所有类型的 default 字符串类型。这可能会实现您需要的大部分功能(尽管它会以另一种方式推动挥杆,因此您需要告诉 other 使用该做什么)。我目前非常积极地破解 dapper,所以我希望这会在短期内实现。

    请注意,您不需要使用DynamicParameters;你也可以使用:

    stringParam = new DbString { Value = stringVal, IsAnsi = true }
    

    【讨论】:

    • 有趣的提议,但我的直觉是对 API 的行为取决于调用程序集中的属性的想法感到不舒服。性能、内联和可维护性(特别是通过将类移动到不同的程序集中可以改变行为这一事实)呢?
    • @Joe il-merge 确实会使事情复杂化
    • 感谢您的回复,但stringParam = new DbString { Value = stringVal, IsAnsi = true } 无法正常工作。只有当我使用DynamicParameters 传递参数时,它才能正常工作。你能解释一下我应该如何使用[assembly:SomeName(blah)]吗?
    • @MarekRuszczyk 强调:此时这只是一个提议。为了让您使用它,我需要编写代码。不过,我会检查 dbstring - 这应该可以。
    • @MarekRuszczyk 这可以正常工作:pastie.org/9158605 - 你能更具体地说明不工作的场景吗?
    猜你喜欢
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多