我是Dapper的新手,想知道为什么我的代码在没有它的情况下运行时会出现以下原因?
如果您正在执行where子句,Dapper支持varchar参数 使用param的varchar列肯定以这种方式传递它:
Query<Thing>("select * from Thing where Name = @Name", new {Name = new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true });
在SQL Server上查询unicode时使用unicode至关重要 和ansi在查询非unicode时。
下面是我的代码,它在不使用DbString等的情况下针对SQL Server 2012运行。
create table Author (
Id int identity(1,1),
FirstName varchar(50),
LastName varchar(50)
);
go
insert into Author (FirstName, LastName) values ('Tom', 'John');
public Author FindByVarchar(string firstName)
{
using (IDbConnection db = DBHelper.NewSqlConnection())
{
return db.Query<Author>("Select * From Author WHERE FirstName = @firstName", new { firstName }).SingleOrDefault();
}
}
问题:
1为什么在这种情况下使用DbString类型?
2为什么长度设置为10(例如长度= 10)当&#34; abcde&#34;是5?
3当我的当前代码有效时,我还需要使用DbString吗?
4为unicode列设置IsAnsi = false是正确的吗?
5对于varchar列,设置IsFixedLength = false是否正确,并忽略设置Length?
答案 0 :(得分:3)
该示例的目的是描述数据类型为char(10)
的场景。如果我们刚使用"abcde"
,Dapper可能会认为nvarchar(5)
是合适的。在某些情况下这会非常低效 - 特别是在where
子句中,因为RDBMS可以决定它不能使用索引,而是需要表扫描为每个行执行字符串转换。表格从char(10)
到nvarchar
版本。出于这个原因,DbString
存在 - 帮助您完全控制 Dapper如何为文本数据配置参数。
我认为这可以回答你的1和2。
3:你使用的是ANSI(非unicode文本)还是固定宽度的文本?请注意,如果总是避免使用unicode
,也可以全局设置ANSI默认值4:是的
5:是的
4 + 5合并:如果您正在使用nvarchar
:只需使用string