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
相关产品推荐
相关产品推荐

