【发布时间】:2020-07-19 14:48:40
【问题描述】:
我有一个 .asp 页面,我正在向该页面传递数据,该页面需要将信息发送到 SQL 服务器存储过程,获取返回值,然后将其传递回主页。我目前有页面发送数据,并且可以验证这一点,因为存储的过程是插入和选择。所以我看到正在插入的数据。出于某种原因,选择部分没有被传递回页面。
这是 ASP 页面发送数据到的存储过程:
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
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
这是asp页面。我正在使用该线程“Using Stored Procedure in Classical ASP .. execute and get results”中“Lankymart”的代码
<%
Dim conn_string, row, rows, ary_data
conn_string = "Provider=SQLOLEDB; Data Source = (Local) ; Initial Catalog = Testonline ; User Id = sa; Password=Test123"
Set objCommandSec = CreateObject("ADODB.Command")
With objCommandSec
.ActiveConnection = conn_string
.CommandType = 4
.CommandText = "dbo.Insertpurchase"
.Parameters.Append .CreateParameter("@UserID", 200, 1, 10, 1)
.Parameters.Append .CreateParameter("@purchaseID", 200, 1, 50, 1)
.Parameters.Append .CreateParameter("@MemberID", 200, 1, 50, 1)
.Parameters.Append .CreateParameter("@DependentID", 200, 1, 50, 1)
.Parameters.Append .CreateParameter("@ServiceDate", 200, 1, 10, "01012020")
.Parameters.Append .CreateParameter("@purchaseDate", 200, 1, 50, "01012020")
.Parameters.Append .CreateParameter("@purchaseNumber", 200, 1, 50, 1)
.Parameters.Append .CreateParameter("@Amount", 200, 1, 50, "")
.Parameters.Append .CreateParameter("@Status", 200, 1, 50, "")
Set rs = .Execute()
If Not rs.EOF Then ary_data = rs.GetRows()
Call rs.Close()
Set rs = Nothing
End With
Set objCommandSec = Nothing
'Command and Recordset no longer needed as ary_data contains our data.
If IsArray(ary_data) Then
' Iterate through array
rows = UBound(ary_data, 2)
For row = 0 to rows
objOutFile.WriteLine row
' Return our row data
' Row N column 2 (index starts from 0)
Call Response.Write(ary_data(0, row) & "")
Next
Else
' Nothing returned
Call Response.Write("No data returned")
End If
%>
我需要使用存储过程选择中的数据来“Response.Write”的 asp 页面,但它似乎没有获取数据。任何帮助都将不胜感激。 谢谢
【问题讨论】:
-
将
SET NOCOUNT ON添加到 proc 的开头以抑制插入生成的DONE_IN_PROC(rowcount) 消息。这些将隐藏后续选择返回的结果集,除非您在 ADO 经典代码中调用 NextRecordSet(在 ADO.NET 世界中不需要)。另外,为proc日期参数指定数据类型date并在插入和删除子字符串中直接使用参数并转换丑陋。 -
@M-Corp 所以您使用了来自my answer 的示例代码,但没有读取第 2 点。- "设置
SET NOCOUNT ON将停止这些输出,并且只有您预期的记录集将是回来了。”?具有讽刺意味的是,这个问题的答案就在您链接的答案中。 -
@Lankymart,不会撒谎。如果我通过 c# 或 VB.net 应用程序运行普通的存储 proc SQL 查询,我会得到相同的结果。当我找到你的答案时,我已经花了两天时间,并通过了其他 3 种方法。我从您的帖子中真正读到的唯一内容是“使用 asp-classic 多年后的一些提示”...
-
@M-Corp 回答了这个特殊的问题,我实际上已经将the comment 中的错误答案链接到this one。
-
@M-Corp 如果您发现自己不得不使用 Classic ASP 和 ADODB,建议您通读这些提示以供将来参考。
标签: sql-server vbscript asp-classic