使用Dapper获取nvarchar(max)会返回一个修剪为4000个字符的字符串.这种行为可以改变吗?

Q''*_*Q'' 6 c# sql-server json dapper

我有一个SQL Server数据表,它在其中一个列中存储JSON字符串.JSON字符串是序列化的.net对象,数据通常超过4000个字符.

我有一个简单的存储过程,我用它来检索数据:

    @StageID int,
    @Description varchar(250) = null OUTPUT,
    @Program nvarchar(max) = null OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    SELECT @Program = StageProgram, @Description = Description 
    FROM StageProgram 
    WHERE StageID = @StageID;

    RETURN 0;
END 
Run Code Online (Sandbox Code Playgroud)

我正在使用nvarchar(max)列的数据类型.当我将.net对象序列化为JSON并使用Dapper将其写入数据库时​​,我发现完整的字符串正确存储在数据库中.

但是,当我尝试检索字符串时,我发现它被修剪为4000个字符,丢弃其余的数据.

这是相关代码:

DynamicParameters p = new DynamicParameters();

p.Add("@StageID", Properties.Settings.Default.StageID, DbType.Int32, ParameterDirection.Input);
p.Add("@Description", "", DbType.String, direction: ParameterDirection.Output);
p.Add("@Program", "", DbType.String, direction: ParameterDirection.Output);
p.Add("@ReturnValue", DbType.Int32, direction: ParameterDirection.ReturnValue);               

try
{
     int stageID = Properties.Settings.Default.StageID;
     connection.Execute(sql, p, commandType: CommandType.StoredProcedure);                 
     json = p.Get<string>("@Program");
     int r = p.Get<int>("@ReturnValue");                    
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,字符串json被修剪为4000个字符.

如果我使用内置的.net SQL Server连接来检索它(为了简单起见使用查询而不是存储过程),正确返回完整数据:

SqlCommand getProgram = new SqlCommand("SELECT StageProgram FROM StageProgram WHERE StageID = 1;");
getProgram.Connection = connection;
string json = Convert.ToString(getProgram.ExecuteScalar());
Run Code Online (Sandbox Code Playgroud)

经验丰富的Dapper用户是否能够为此行为提供解释?

可以改变吗?

stu*_*rtd 9

4000个字符是Dapper中DBString的默认长度:

来自上述链接的代码图片

要获取全文,只需设置size参数:

p.Add("@Program", "", DbType.String, direction: ParameterDirection.Output, size:int.MaxValue);
Run Code Online (Sandbox Code Playgroud)

  • 你钉了它,@ stuartd - 谢谢.我没有意识到Dapper的源代码在Github上可用,因此它也很有用. (2认同)