使用 ASP 页面从 SQL Server 存储过程返回数据[重复]

问题描述 投票:0回答:1

我有一个

.asp
页面,我正在向该页面传递数据,需要将信息发送到 SQL Server 存储过程,获取返回值,然后将其传递回主页。我目前有发送数据的页面,并且可以验证这一点,因为存储过程是插入和选择。所以我看到数据被插入。由于某种原因,选择的部分没有传递回页面。

这是 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页面。我正在使用此线程中“Lankymart”的代码“在经典 ASP 中使用存储过程..执行并获取结果

<%


    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
 
%>

我需要 asp 页面使用存储过程 select 中的数据进行“Response.Write”,但似乎没有获取数据。任何帮助将不胜感激。

谢谢

sql-server vbscript asp-classic
1个回答
1
投票

在存储过程中有两个语句,每个语句都会返回一个“结果”。 insert 语句的结果不会是数据表,而是一条说明插入了多少行的消息。当您调用

Set rs = .Execute()
时,
rs
的值将包含第一个“结果”,该结果将是
insert
给出的结果,而不是
select
给出的结果。

有两种方法可以解决这个问题。第一个是告诉 SQL 不要为 insert 语句返回“结果”,这样您得到的唯一结果就是 select 语句中的数据表。您可以通过将

set nocount on
语句添加到过程的开头来完成此操作。

您也可以在过程的开头添加一个

begin
,并在过程的末尾添加一个
end
,这是一个常见的模式(但这不是必需的,所以如果您不喜欢它,没问题):

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
begin
   set nocount on; -- < tell SQL not to return the "rows affected" 
   DECLARE @purchaseNo bigint
   -- the rest of your procedure code
end

或者,您可以通过使用

rs.NextRecordSet

询问下一组结果来告诉记录集您不想要第一个结果

选择其中之一,而不是两者都做!

© www.soinside.com 2019 - 2024. All rights reserved.