You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor中用EF调用存储过程返回字符串仅获首字符问题

问题解决:EF调用SQL Server存储过程返回字符串仅取第一个字符

问题根源

问题出在未显式指定输出参数的Size属性。当创建SqlParameter时,如果仅传入初始字符串值而不设置Size,Entity Framework会根据初始字符串的长度自动设置参数大小:

  • 若初始值为空字符串,参数Size会被设为0;
  • 若初始值为短字符串,Size会被设为该字符串的长度。
    SQL Server返回的字符串会被截断到参数指定的Size长度,最终只返回第一个字符(当Size=0或1时)。

解决方案

为输出参数显式设置Size,对应存储过程中varchar(50)的长度,将Size设为50即可:

修改后的C#代码

string outList = "";

var xparams = new SqlParameter[] {
    new SqlParameter("@Start", 10),
    new SqlParameter("@End", 20),
    new SqlParameter("@output", outList) { 
        Direction = ParameterDirection.Output,
        Size = 50 // 匹配存储过程中varchar的定义长度
    }
};

_context.Database.ExecuteSqlRaw("exec GetMe  @Start, @End, @output output", xparams);
var ReturnValue = ((SqlParameter)xparams[2]).Value?.ToString();

也可以直接通过指定SqlDbType和Size初始化参数:

new SqlParameter("@output", SqlDbType.VarChar, 50) { 
    Direction = ParameterDirection.Output 
}

对应测试点的验证

  • 使用Set替代Select结果一致:问题不在存储过程的赋值方式,而在参数Size设置
  • 返回int、float等类型正常:这类值类型无需指定Size,EF可正确处理
  • 初始化非空字符串仍有问题:初始字符串长度若小于存储过程返回的字符串长度,参数Size会被设为初始长度,导致返回值被截断
  • 存储过程在SSMS运行正常:SSMS会自动处理参数长度,无需显式指定

内容的提问来源于stack exchange,提问作者David Jones

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 22:12:18