使用TableAdapter调用带EXECUTE的MSSQL存储过程返回值异常
解决TableAdapter调用MSSQL存储过程返回值始终为0的问题
我之前也碰到过一模一样的情况——存储过程在SQL Server里跑完全正常,TableAdapter预览数据也能拿到正确编号,但自己写代码调用就是返回0,简直头大。核心问题其实是TableAdapter自动生成的方法默认没正确配置去捕获存储过程的RETURN值,下面给你几个可行的解决方案:
方案一:修改TableAdapter的方法配置(最贴合你的现有代码)
- 打开你的数据集(.xsd文件)设计器,找到
paydetailTableAdapter里的getsystemnumber方法。 - 右键这个方法,选择「配置」进入命令配置向导。
- 确认命令类型是「存储过程」,然后点击「高级选项」,确保没有勾选错误的选项。
- 关键一步:切换到「参数」标签页,手动添加一个返回值参数:
- 参数名设为
@ReturnVal(名称可自定义,只要方向正确即可) - 数据类型选
Int32 - 方向设置为「ReturnValue」
- 参数名设为
- 保存配置后,重新生成你的项目,再调用试试。
方案二:修改存储过程,返回结果集(更省心的方式)
有时候TableAdapter对RETURN值的支持不如结果集友好,我们可以给存储过程加一行返回结果集的代码,这样TableAdapter能自动识别并生成正确的返回值方法:
ALTER PROCEDURE [dbo].[getsystemnumber](@p_controlid varchar(8), @p_alternateid varchar(8)) AS DECLARE @return_number int EXECUTE @return_number = dbo.getsystemnumber_gateway @p_controlid, @p_alternateid, 1 SELECT @return_number AS PydNumber -- 新增这行,返回一个结果集 RETURN @return_number
然后回到数据集设计器,更新getsystemnumber方法的配置,让它返回一个Scalar类型的值(也就是int),之后调用代码就能拿到正确的编号了。
方案三:绕开TableAdapter,手动用ADO.NET调用(最灵活)
如果上面两种方法都折腾不好,直接写原生的ADO.NET代码反而更靠谱:
// 记得替换成你的数据库连接字符串 string connString = "YourConnectionStringHere"; using (SqlConnection conn = new SqlConnection(connString)) { SqlCommand cmd = new SqlCommand("dbo.getsystemnumber", conn); cmd.CommandType = CommandType.StoredProcedure; // 添加输入参数 cmd.Parameters.Add("@p_controlid", SqlDbType.VarChar, 8).Value = "PYDNUM"; cmd.Parameters.Add("@p_alternateid", SqlDbType.VarChar, 8).Value = " "; // 添加返回值参数 SqlParameter returnParam = cmd.Parameters.Add("@ReturnVal", SqlDbType.Int); returnParam.Direction = ParameterDirection.ReturnValue; conn.Open(); cmd.ExecuteNonQuery(); // 执行存储过程 int pydNumber = (int)returnParam.Value; // 获取返回值 lbPydnumber.Items.Add(pydNumber); }
至于为什么预览数据能拿到正确值?因为VS的预览数据功能会自动检测存储过程的输出(不管是RETURN值还是结果集),但自动生成的TableAdapter方法默认只会执行ExecuteNonQuery,不会主动去捕获RETURN参数,所以才会返回0。
内容的提问来源于stack exchange,提问作者Flefel
相关产品推荐
相关产品推荐

