从sql存储过程返回多个值

Joh*_*5er 3 sql vb.net asp.net stored-procedures

我正在尝试将4个变量从存储过程返回到ASP.Net VB脚本中的页面.它只返回第一个结果然后破坏.我对SQL的了解有限.我尝试过以下方法:

SQL:

Alter PROCEDURE  [dbo].[spDashboardPaymentRequests]
@id integer
AS
SELECT COUNT(Receiptno) as requestsSent
FROM [demofeepay3].[dbo].[vwallrequests]
Where Orgid = @id

SELECT Sum(totamount) as requestTotal
FROM [demofee].[dbo].[vwallrequests]
Where Orgid = @id

SELECT Sum(totamount) as requestTotalPaid
FROM [demofee].[dbo].[vwallrequests]
Where Orgid = @id AND status = 'paid'

SELECT Sum(totamount) as requestTotalUnpaid
FROM [demo].[dbo].[vwallrequests]
Where Orgid = @id AND status = 'unpaid'
Run Code Online (Sandbox Code Playgroud)

ASP.NET

Function RequestsSent()
    Dim objCmd2 As sqlCommand
    Dim objRdr2 As sqlDataReader
    objCmd2 = New SqlCommand("spDashboardPaymentRequests", objConn)
    objCmd2.CommandType = CommandType.StoredProcedure
    objCmd2.Parameters.AddWithValue("@orgid", Session("orgid"))
    objConn.Open()
    objRdr2 = objCmd2.ExecuteReader
    objRdr2.Read()
    Session("RequestsSent") = objRdr2("requestsSent")
    Session("RequestsTotal") = objRdr2("requestTotal")
    Session("RequestsTotalPaid") = objRdr2("requestTotalPaid")
    Session("RequestsTotalUnpaid") = objRdr2("requestTotalUnpaid")
    objConn.Close()
End Function
Run Code Online (Sandbox Code Playgroud)

jav*_*iry 5

你有多个selects,这意味着多个结果集.所以你必须通过它们:

objRdr2.Read()
Session("RequestsSent") = objRdr2("requestsSent")

objRdr2.NextResult()
objRdr2.Read()
Session("RequestsTotal") = objRdr2("requestTotal")

objRdr2.NextResult()
objRdr2.Read()
Session("RequestsTotalPaid") = objRdr2("requestTotalPaid")

objRdr2.NextResult()
objRdr2.Read()
Session("RequestsTotalUnpaid") = objRdr2("requestTotalUnpaid")
Run Code Online (Sandbox Code Playgroud)

或者,您可以更改sproc以返回包含多个列的一个结果集:

Alter PROCEDURE  [dbo].[spDashboardPaymentRequests]
@id integer
AS
SELECT
    (SELECT COUNT(Receiptno) FROM [demofeepay3].[dbo].[vwallrequests] Where Orgid = @id) 
    as requestsSent,

    (SELECT Sum(totamount) FROM [demofee].[dbo].[vwallrequests] Where Orgid = @id) 
    as requestTotal,

    (SELECT Sum(totamount) FROM [demofee].[dbo].[vwallrequests] Where Orgid = @id AND status = 'paid')
    as requestTotalPaid,

    (SELECT Sum(totamount) FROM [demo].[dbo].[vwallrequests] Where Orgid = @id AND status = 'unpaid')
    as requestTotalUnpaid
Run Code Online (Sandbox Code Playgroud)