索引超出了数组SqlDataReader.GetDecimal的范围

时间:2017-05-24 08:06:59

标签: c# .net sql-server

我想总结一下Amount列,但收到此错误消息

  

其他信息:索引超出了数组的范围。

以下是SQL数据库中Balance表的定义:

CREATE TABLE [dbo].[Balance]
(
    [BalanceID] [int] IDENTITY(1,1) NOT NULL,
    [Sn] [nvarchar](50) NULL,
    [Description] [nvarchar](1000) NULL,
    [Date] [date] NULL,
    [Amount] [decimal](8, 0) NULL
)

以下是通过SQL内联

访问表的代码C#
cn.Open();

SqlCommand cmd = cn.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "Select sum(Amount) from Balance where Sn=@sn and Date Between @SD and @ED";

cmd.Parameters.Add(new SqlParameter("@sn", txtSn.Text));
cmd.Parameters.Add(new SqlParameter("@SD", DTPStart.Text));
cmd.Parameters.Add(new SqlParameter("@ED", DTPEnd.Text));
SqlDataReader reader = cmd.ExecuteReader();

while (reader.Read())
{
    Debt = reader.GetDecimal(4);
}

reader.Close();
cn.Close();

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

方法GetDecimal获取作为方法调用的参数提供的具有从零开始的索引的列的值。

您只在查询Select sum(Amount) from Balance中返回一列,但尝试在reader.GetDecimal(4)中找到第五列

所以将代码更改为

Debt = reader.GetDecimal(0);

更新:正如评论中所述 - 在您的特定情况下,您根本不需要ExecuteReader。由于您从服务器返回单个值 - 您可以使用ExecuteScalar代替执行查询,并返回查询返回的结果集中第一行的第一列。