13

我正在对字符串主要存储在VarChar列中的数据库使用 Dapper。默认情况下,DapperNVarChar在生成查询时使用参数,虽然我可以包装我使用的每个字符串参数,但默认情况下使用 AnsiStrings 并用于这种情况DbString会很棒。DbStringNVarChar

我尝试将 Dapper 源中的类型映射从 更改为DbType.StringDbType.AnsiString但这似乎会导致参数委托的 IL 生成错误(抛出一个InvalidProgramException)。

有没有更简单的方法来做到这一点?

更新

仅仅改变 typeMap 是不够的,我还需要改变一些if (dbType == DbType.String)检查。现在它起作用了!

4

2 回答 2

31

您可以在不修改源代码的情况下完成此操作。

Dapper.SqlMapper.AddTypeMap(typeof(string), System.Data.DbType.AnsiString);

设置一次会将所有字符串调整为 varchar。

于 2014-10-09T15:43:04.507 回答
3

要默认使用 ansistrings,我必须(参考 NuGet 的 Dapper 1.3 源代码):

  • 更改类型映射以DbType.AnsiString在 L164 上使用,而不是DbType.String
  • 在该方法CreateParamInfoGenerator中,将 L960、L968、L973 上的检查更改为包括DbType.AnsiString以及DbType.String

无效 IL 的问题似乎是 L1000 上代码的后面分支检查typeof(string)而前面的分支使用DbType.

这样做一切都很好 - 没有更多的索引扫描!

于 2011-06-20T07:50:02.530 回答