Dapper.NET:varchar(4000)默认值

7

我正在使用Dapper.NET,当我执行下面的代码时:

using (SqlConnection con = new SqlConnection(connectionString))
        {
            con.Open();
            con.Execute(@" insert Clients(name) values(@Name)", new {Name = "John"});
            con.Close();
        }

它执行的查询语句如下:

(@Name nvarchar(4000)) insert Clients(name) values(@Name)

我的问题是:为什么Dapper将字符串翻译成nvarchar(4000)?在数据库中,名称字段是nvarchar(50)...

有人遇到这个错误吗?你如何解决它?你是否发现了其他类似的错误?


我想说(但这只是猜测),这可能是因为Dapper不知道您的表结构,而在.NET中,string是UTF-16(因此非ANSI-string),潜在的长度限制仅受内存限制。这相当于具有最大可用长度的nvarchar类型。我认为这不是一个错误,但您必须自己进行验证或在INSERT时捕获数据完整性违规异常。 - Patryk Ćwiek
1个回答

12

这不是一个bug。Dapper需要为一个字符串参数选择一个SQL数据类型,而不考虑数据库结构(更不用说解析你的查询并确定你将参数插入到特定的列中)。

想象一下,如果你正在做这个:

insert Clients(name) values(@Name + 'abc')

Dapper应该知道@Name参数的长度可以达到47个字符吗?

如果您愿意,可以更具体地指定参数的大小:

con.Execute(@" insert Clients(name) values(@Name)", 
    new { Name = new DbString { Value = "John", Length = 50 }});

1
谢谢,你知道我怎么做才能让它更易读吗?因为如果有很多字段(字符串字段)的插入,它会非常丑陋...还有其他类型的类似东西吗?谢谢。 - ascherman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接