我在Dapper .NET项目主页上找到了以下注释.
Dapper支持varchar参数,如果使用param在varchar列上执行where子句,请确保以这种方式传递它:
Query<Thing>("select * from Thing where Name = @Name", new {Name =
new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true });
Run Code Online (Sandbox Code Playgroud)
在Sql Server上,查询unicode和ansi查询非unicode时使用unicode至关重要
我正在评估Dapper与遗留数据库(SQL Server 2008)一起使用,其中包含许多带varchar参数的存储过程,我对此限制感到有些困惑.
使用手工制作的ADO.NET代码,我将使用以下内容进行上述查询:
new SqlParameter("@Name", "abcde")
Run Code Online (Sandbox Code Playgroud)
没有指定是否是unicode,也没有指定长度.
为什么我需要使用Dapper的详细DbString语法,指定列长度,IsFixedLength和IsAnsi?
为什么varchar列的IsFixedLength = true(我希望它对于char或nchar列是真的)?
我是否必须像这样使用DbString存储过程参数?
我期待Dapper让我的DAL代码更简洁,但这似乎使得varchar参数更加冗长.
UPDATE
我已经进行了进一步的研究,试图理解为什么Dapper会有这个varchar限制,我似乎没有在我手工编写的代码中,我通常会创建一个输入参数,如下所示:
var parameter = factory.CreateParameter(); // Factory is a DbProviderFactory
parameter.Name = ...;
parameter.Value = ...;
Run Code Online (Sandbox Code Playgroud)
并且通常让提供者推断DbType使用自己的规则,除非我特别想要强制它.
看看Dapper的DynamicParameters类,它有一个AddParameters创建参数的方法如下:
var dbType = param.DbType; // Get dbType and value
var val = param.Value; // from
...
// Coerce dbType to a non-null value if val is not null !!!!!
if (dbType == null && val != null) dbType = SqlMapper.LookupDbType(val.GetType(),name);
...
var p = command.CreateParameter();
...
if (dbType != null)
{
p.DbType = dbType.Value;
}
Run Code Online (Sandbox Code Playgroud)
即它明确强制IDataParameter.DbType使用自己的算法查找的值,而不是让提供者使用自己的规则.
有这么好的理由吗?对我来说似乎不对,特别是考虑到Dapper支持varchar参数的评论.
小智 -3
var param = new { Varchar1 = "", Varchar2 = "" };
db.Query("SP", param, commandType:CommandType.StoredProcedure);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3641 次 |
| 最近记录: |