调用存储过程执行IDbConnection.Query报错:nvarchar转int类型失败
解决存储过程返回字符串引发的类型转换错误
你遇到的Conversion failed when converting the nvarchar value 'Memory' to data type int错误,核心问题出在SQL存储过程的RETURN语句用法上——SQL里存储过程的RETURN只能返回整数类型的值(一般用来返回执行状态码),但你在存储过程最后写了RETURN @t,这里@t是从ComponentTypes表拿到的nvarchar类型字符串(比如'Memory'),SQL会强制把这个字符串转成int类型返回,自然就触发了转换失败的错误。
而且你提到的“数据库里没有Memory相关的表或列”是个误解:错误里的'Memory'是你查询到的_Type字段的数据值,不是表或列的名称。
接下来给你两个可行的修改方案,根据你的需求选择:
方案1:使用输出参数返回结果(对应你原有的存储过程参数设计)
修改存储过程
去掉错误的RETURN @t语句,因为输出参数@t和@Index会自动携带结果返回给调用端:
CREATE PROCEDURE GetCurrentType @BuildID INT = 1, @t NVARCHAR(128) OUTPUT, @Index INT OUTPUT AS BEGIN SET NOCOUNT ON; SELECT @Index = COUNT(*) FROM Partslist WHERE buildId = @BuildID; SELECT @t = _Type FROM ComponentTypes WHERE PriorityID = @Index; -- 移除RETURN @t,输出参数已完成数据传递 END
修改C#代码
改用DynamicParameters来处理输出参数,获取返回的值:
// 定义参数,指定输出方向 var parameters = new DynamicParameters(); parameters.Add("@BuildID", 1, DbType.Int32); parameters.Add("@t", string.Empty, DbType.String, ParameterDirection.Output, size: 128); parameters.Add("@Index", 0, DbType.Int32, ParameterDirection.Output); // 执行存储过程 db.Execute("GetCurrentType", parameters, commandType: CommandType.StoredProcedure); // 从输出参数中提取结果 string componentType = parameters.Get<string>("@t"); int selectedPartCount = parameters.Get<int>("@Index"); // 如果需要放到IEnumerable<string>集合中 IEnumerable<string> test = new List<string> { componentType };
方案2:直接返回结果集(更适合查询类场景)
如果你不需要输出参数,也可以让存储过程直接SELECT出结果,这样C#端用Query方法就能直接接收:
修改存储过程
CREATE PROCEDURE GetCurrentType @BuildID INT = 1 AS BEGIN SET NOCOUNT ON; DECLARE @Index INT; DECLARE @t NVARCHAR(128); SELECT @Index = COUNT(*) FROM Partslist WHERE buildId = @BuildID; SELECT @t = _Type FROM ComponentTypes WHERE PriorityID = @Index; -- 直接返回结果集 SELECT @t AS ComponentType, @Index AS SelectedPartCount; END
修改C#代码
// 直接查询结果集,这里可以定义一个匿名类或者实体类接收 var result = db.QueryFirstOrDefault<dynamic>("GetCurrentType", new { BuildID = 1 }, commandType: CommandType.StoredProcedure); IEnumerable<string> test = new List<string> { result.ComponentType };
不管选哪个方案,核心都是避免用RETURN返回非整数类型的数据——这是SQL存储过程的基础规则哦。
内容的提问来源于stack exchange,提问作者spoilerd do
相关产品推荐
相关产品推荐

