0

我有以下stored procedure

Create Procedure [dbo].[spVerifyCustomerUserLogin]    

@EmbossLine varchar(16),    

@password varchar(50)    

as    

    Select C.EmbossLine,C.EmbossName,round(CB.TotalLoading,2),round(CB.Totalredemption,2),round(CB.CardBalance,2) 
    from Card C inner join CardBalance CB on CB.PAN=C.EmbossLine

    where 

    EmbossLine = @EmbossLine 

    and [password] = @password 

    and Status='E0'

我有以下VB.Net代码可以访问它:

Dim UserData As New ArrayList
            Dim dr As SqlDataReader
            dr = GenericDB.ExecuteSPForDataReader("spVerifyCustomerUserLogin", spParameters)
            If dr.HasRows Then
                dr.Read()
                UserData.Add(dr.Item("EmbossLine"))
                UserData.Add(dr.Item("EmbossName"))
                UserData.Add(dr.Item("TotalLoading"))
                UserData.Add(dr.Item("Totalredemption"))
                UserData.Add(dr.Item("CardBalance"))
                dr.Close()
                Return UserData
            End If
            dr.Close()
            Return UserData

问题是我的代码IndexOutOfRangeException

UserData.Add(dr.Item("TotalLoading"))

请注意,当我访问没有该round函数的存储过程时,它可以正常工作,因此它与我的圆形函数有关。请注意,我的 Fields和TotalLoading是money 类型。是不是因为这个?TotalRedemptionCardBalance

4

2 回答 2

2

不,这是因为您在 totalLoading 列上使用了一个函数并且没有给它取别名。

将存储过程中的 SELECT 语句更改为:

 Select 
  C.EmbossLine,
  C.EmbossName,
  round(CB.TotalLoading,2) as TotalLoading,
  round(CB.Totalredemption,2) as TotalRedemption,
  round(CB.CardBalance,2) as CardBalance
        from Card C inner join CardBalance CB on CB.PAN=C.EmbossLine
于 2015-04-21T12:31:07.923 回答
2

当您对列(例如 )执行操作时,round(CB.TotalLoading,2)它不再具有名称。您可以使用 给它命名AS,例如

SELECT C.EmbossLine, C.EmbossName, ROUND(CB.TotalLoading, 2) AS 'RoundedTotalLoading',...
于 2015-04-21T12:31:28.030 回答