Sql server 使用ASP页从SQL Server存储过程返回数据

Sql server 使用ASP页从SQL Server存储过程返回数据,sql-server,vbscript,asp-classic,Sql Server,Vbscript,Asp Classic,我有一个要传递数据的.asp页面,需要将信息发送到SQL server存储过程,获取返回值,然后将其传递回主页。我目前有发送数据的页面,并且可以验证这一点,因为存储的过程是插入和选择。所以我看到数据被插入。由于某些原因,选择部分没有传递回页面 这是asp页将数据发送到的存储过程: ALTER PROCEDURE [dbo].[Insertpurchase] @UserID bigint, @purchaseID bigint, @MemberID big

我有一个要传递数据的.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页面来响应。使用存储的proc select中的数据进行写入,但它似乎没有获取数据。任何帮助都将受到感谢。
谢谢

在存储过程中有两条语句,每条语句都将返回一个结果。insert语句的结果将不是一个数据表,而是一条说明插入了多少行的消息。当您调用Set rs=.Execute时,rs的值将包含第一个结果,这将是insert给出的结果,而不是select给出的结果

有两种方法可以解决这个问题。第一种方法是告诉SQL不要返回insert语句的结果,这样您得到的唯一结果就是select语句中的数据表。可以通过将SETNOCOUNT on语句添加到过程的开头来实现这一点

您还可以在过程的开始和结束之间添加一个开始,这是一种常见的模式,但不是必需的,因此如果您不喜欢,没问题:

更改过程[dbo]。[Insertpurchase] @用户id bigint, @purchaseID bigint, @MemberID bigint, @受抚养人, @ServiceDate varchar20, @购买日期:varchar20, @purchaseNumber bigint, @金额为20, @状态varchar20 像 开始 不计数;-<告诉SQL不要返回受影响的行 声明@purchaseNo bigint -其余的过程代码 终止 或者,您可以通过使用请求下一组结果来告诉记录集您不想要第一个结果


做一个或另一个,而不是两个都做

将SET NOCOUNT ON添加到过程的开头,以抑制insert生成的DONE_IN_proc rowcount消息。除非在ADO.NET世界中不需要的ADO经典代码中调用NextRecordSet,否则这些将隐藏后续select返回的结果集。另外,为proc date参数指定数据类型date,并直接在insert中使用参数,删除子字符串并转换丑陋。@M-Corp所以您使用了第2点的示例代码,但没有读取第2点。-将SET NOCOUNT设置为ON将停止这些输出,并且只返回预期的记录集。?具有讽刺意味的是,这个问题的答案就在你链接的答案中。@Lankymart,不打算撒谎。我希望通过c或VB.net应用程序运行一个普通的存储过程SQL查询时得到相同的结果。当我找到你的答案时,我已经花了两天的时间在这个问题上,并通过了其他3种方法。在与asp classic合作多年后,我从你的帖子中真正读到的唯一一件事是几条提示…@M-Corp回答了这个问题,我多次将错误的答案链接到了“意思”。@M-Corp如果你发现自己不得不与classic asp和ADODB合作,建议以后阅读这些提示参考资料。是的,已经包括在内了。
<%


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