varchar的DbString,IsFixedLength和IsAnsi

时间:2017-12-10 16:50:49

标签: dapper

我是Dapper的新手,想知道为什么我的代码在没有它的情况下运行时会出现以下原因?

  

Ansi Strings and varchar

     

如果您正在执行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?

1 个答案:

答案 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