我正在使用Dapper对数据库,其中字符串主要存储在VarChar列中.默认情况下,Dapper NVarChar在生成查询时使用参数,而我可以将我使用的每个字符串参数包装起来DbString,默认情况下使用AnsiStrings非常好并且DbString用于NVarChar案例.
我试图从改变所述小巧玲珑源的类型映射DbType.String到DbType.AnsiString然而,似乎导致IL生成的误差的参数代表(引发InvalidProgramException).
有更简单的方法吗?
更新
只是改变typeMap是不够的我也需要改变一些if (dbType == DbType.String)检查.现在它有效!
类似于问题如何让 Dapper 将 .net DateTime 映射到 DateTime2;但我希望事后能够将其重新设置回来。
该问题当前接受的答案涉及更改 Dapper 源文件;但我正在使用 NuGet 包,所以这对我不起作用。正如对已接受答案的第一条评论所指出的,这是不可逆的 - “如果有些是 DateTime 而另一些是 DateTime2 怎么办?” - 这就是我的场景:不同的查询需要不同的映射(每个查询只需要其中之一)。
我正在使用同一问题的得票较高的答案。然而,这种做法似乎也是不可逆转的。似乎第一个查询完成时设置的任何值都会保留,并且此后不可更改。
以下代码是 MCVE。如果运行它,您会看到类型始终显示为“datetime”,并且值的精度永远不会超过毫秒(正如您对日期时间的期望);尽管尝试改变映射。然后,您必须注释掉对“PerformDapperQuery()”的第一次调用,然后再次运行它:您现在将看到该类型始终返回为“datetime2”,并且这些值在秒的小数部分上具有完整的 7 位精度(正如您对 datetime2 的期望)。
public static void Main()
{
// I know this is marked as obsolete, and I am open to suggestions for alternatives.
// see https://github.com/StackExchange/Dapper/issues/798
#pragma warning disable 618
var oldValue = SqlMapper.LookupDbType(typeof(DateTime), null, false, out var handler);
#pragma warning restore 618
PerformDapperQuery();
SqlMapper.AddTypeMap(typeof(DateTime), …Run Code Online (Sandbox Code Playgroud)