【问题标题】:Does dapper auto trims strings that get inserted to the database?dapper 会自动修剪插入数据库的字符串吗?
【发布时间】:2018-12-12 20:20:26
【问题描述】:

我使用 .net 作为后端,使用 SQL Server 作为数据库。我以两种方式将记录插入数据库,第一种方法是使用 crud 操作,第二种方法是使用 SQL Server 存储过程,该过程使用 dapper 调用。

使用Dapper时,自动修剪长字符串,但使用crud操作时,插入失败并出现以下错误:

字符串或二进制数据将被截断

我只想知道 Dapper 是否负责自行修剪这些字符串。

代码如下:

int result = await unitOfWork.GetService<IUserService>().AddUserAsync(userModel); // here I get an error during insert

在这里使用 dapper:

return await GetDapper().ExcecuteScalarAsync<int>("dbo.insert_user", new { @userId = userId, @userName = userName });

【问题讨论】:

  • 你自己测试过,你就知道答案了。那你为什么在这里问?

标签: .net sql-server dapper


【解决方案1】:

静默截断不是由 Dapper 完成的,而是由 SQL Server 中的存储过程完成的。您可以轻松测试:当字符串太长时,CRUD 操作会出错,但存储过程不会:

CREATE TABLE Person (Name VARCHAR(4));

GO

INSERT INTO Person VALUES ('John Smith');
-- Error: String or binary data would be truncated.

GO

CREATE PROCEDURE InsertPerson 
    @Name VARCHAR(5)
AS
    INSERT INTO Person VALUES (@Name);

GO

EXECUTE InsertPerson 'Jane Smith';
-- Inserts 'Jane'

关于这种行为有很多讨论;例如:SQL Server silently truncates varchar's in stored procedures

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 2014-06-03
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多