ASP页面调用SQL Server存储过程无法获取返回结果求助
解决ASP无法获取SQL Server存储过程SELECT返回结果的问题
看起来你遇到的核心问题是:存储过程执行INSERT操作后,后续SELECT的结果没有被ASP页面正确捕获。这里有几个关键的修复点,我们一步步来解决:
1. 给存储过程添加SET NOCOUNT ON
SQL Server执行INSERT、UPDATE、DELETE这类操作时,默认会返回一个“受影响行数”的结果集。这个结果集是第一个被返回的,而你需要的SELECT结果是第二个结果集。ASP的ADODB.Recordset默认只会读取第一个结果集,所以你拿不到想要的数据。
修改你的存储过程,在开头加上SET NOCOUNT ON;:
ALTER PROCEDURE [dbo].[Insertpurchase] @UserID bigint, @purchaseID bigint, @MemberID bigint, @DependentID bigint, @ServiceDate varchar(20), @purchaseDate varchar(20), @purchaseNumber bigint, @Amount varchar(20), @Status varchar(20) AS SET NOCOUNT ON; -- 新增这行,关闭受影响行数的结果集 DECLARE @purchaseNo bigint SET @purchaseNo = (SELECT [LastNumber] FROM [purchaseAdmin] where [id] = @purchaseID ); DECLARE @day varchar(20) DECLARE @month varchar(20) DECLARE @year varchar(20) DECLARE @ServiceOFDate varchar(20) DECLARE @purchaseOFDate varchar(20) SET @ServiceOFDate = SUBSTRING(@ServiceDate, 1, 2)+'/'+SUBSTRING(@ServiceDate, 3, 2)+'/'+SUBSTRING(@ServiceDate, 5, 4); set @purchaseOFDate = SUBSTRING(@purchaseDate, 1, 2)+'/'+SUBSTRING(@purchaseDate, 3, 2)+'/'+SUBSTRING(@purchaseDate, 5, 4); insert into [NewPurchase] ( [UserID] ,[purchaseID] ,[MemberID] ,[DependentID] ,[ServiceDate] ,[purchaseDate] ,[purchaseNumber] ,[Amountpurchase] ,[Status] ) values ( @UserID, @purchaseID , @MemberID , @DependentID , CONVERT(datetime,@ServiceOFDate) , CONVERT(datetime,@purchaseOFDate) , (@purchaseNo+1) , @Amount , @Status ) ; select (@purchaseNo+1) as purchases
2. 修正ASP参数的数据类型
你的ASP代码里所有参数都用了200(对应adVarChar),但像@UserID、@purchaseID这类参数是bigint类型,应该使用20(对应adBigInt)。类型不匹配可能导致隐性转换,甚至影响结果的正确返回:
修改参数定义部分,示例如下:
.Parameters.Append .CreateParameter("@UserID", 20, 1, , 1) ' adBigInt = 20 .Parameters.Append .CreateParameter("@purchaseID", 20, 1, , 1) .Parameters.Append .CreateParameter("@MemberID", 20, 1, , 1) .Parameters.Append .CreateParameter("@DependentID", 20, 1, , 1) .Parameters.Append .CreateParameter("@purchaseNumber", 20, 1, , 1) -- 字符串类型的参数保持200不变 .Parameters.Append .CreateParameter("@ServiceDate", 200, 1, 10, "01012020") .Parameters.Append .CreateParameter("@purchaseDate", 200, 1, 50, "01012020") .Parameters.Append .CreateParameter("@Amount", 200, 1, 50, "") .Parameters.Append .CreateParameter("@Status", 200, 1, 50, "")
注:
CreateParameter的第四个参数是字段长度,对于bigint可以留空,因为它是固定长度的类型。
3. 优化ASP的Recordset处理逻辑
你可以简化代码,直接读取Recordset的字段值,这样更直观:
Set rs = .Execute() If Not rs.EOF Then ' 直接读取purchases字段的值 Response.Write("返回的采购编号:" & rs("purchases")) Else Response.Write("No data returned") End If Call rs.Close() Set rs = Nothing
如果坚持使用GetRows(),你的原代码逻辑是没问题的,但添加SET NOCOUNT ON后,Recordset会直接拿到SELECT的结果集,后续遍历数组就能正常输出数据。
额外检查点
- 确认
purchaseAdmin表中存在@purchaseID对应的记录,否则@purchaseNo会是NULL,SELECT返回的也是NULL,你可能误以为没拿到结果。 - 可以在SQL Server Management Studio里手动执行存储过程,验证SELECT是否能返回预期的值:
EXEC Insertpurchase @UserID=1, @purchaseID=1, @MemberID=1, @DependentID=1, @ServiceDate='01012020', @purchaseDate='01012020', @purchaseNumber=1, @Amount='100', @Status='Active'
按照以上步骤修改后,你的ASP页面应该就能正确输出存储过程返回的purchases值了。
内容的提问来源于stack exchange,提问作者M-Corp
相关产品推荐
相关产品推荐

