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

调用存储过程执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:13:46