System.IndexOutOfRangeException:索引超出了数组的范围

我正在开发一个ATM软件作为家庭作业,我想知道今天处理的交易总量,为此我正在编写以下代码

public decimal getDayTransaction(int accountid, string date, string transactiontype) { decimal totalamount = 0; int i = 0; string connectionString = "Persist Security Info=False;User ID=sa; Password=123;Initial Catalog=ATMSoftware;Server=Bilal-PC"; try { using (SqlConnection connection = new SqlConnection(connectionString)) { SqlCommand command = new SqlCommand( "Select Amount From [Transaction] where AccountID = " + accountid + " AND CurrDate ='" + date + "' AND TransactionType = '" + transactiontype + "';", connection); connection.Open(); SqlDataReader dr = command.ExecuteReader(); while (dr.Read()) { totalamount += Convert.ToDecimal(dr.GetString(i)); i++; } return totalamount; } } catch (Exception e) { return -1; } } 

但是我得到exceptionSystem.IndexOutOfRangeException:索引超出了数组的范围,尽管在数据库中有多个记录可用,它们通过在查询窗口中运行相同的查询来获得。 但我不知道如何通过编码获得它。

请帮我。

问候

那是因为你试图阅读太多列IMO。

  while (dr.Read()) { totalamount += Convert.ToDecimal(dr.GetString(i)); i++; } 

谁说列数多于行数? 看起来你想要总结一个专栏。

你通过选择所有行来浪费时间。 如果您正在寻找SUM,请改用SUM(COLUMN1)

  SqlCommand command = new SqlCommand("Select SUM(Amount) as sAmount From [Transaction] where AccountID = " + accountid + " AND CurrDate ='" + date+ "' AND TransactionType = '" + transactiontype + "';", connection); connection.Open(); SqlDataReader dr = command.ExecuteReader(); while (dr.Read()) { totalamount += Convert.ToDecimal(dr.GetString(0)); break; // Only read once, since it returns only 1 line. } return totalamount; 

像这样改变时间。

 while (dr.Read()) { totalamount += Convert.ToDecimal(dr.GetString(0)); } 

那里不需要i

我认为问题在于这一行

  totalamount += Convert.ToDecimal(dr.GetString(i)); i++; 

为什么递增i ? 你不需要增加i

i在这里代表column index 。 您应该从同一列读取,因此您不需要增加i

此外,建议使用column name而不是index来检索值

如果只应获取一个值,请使用SqlCommand.ExecuteScalar,它返回单个值。

 SqlCommand command = new SqlCommand("Select SUM(Amount) as TotalAmount From [Transaction] where AccountID = " + accountid + " AND CurrDate ='" + date + "' AND TransactionType = '" + transactiontype + "';", connection); connection.Open(); decimal totalAmount = (decimal)command.ExecuteScalar(); 

要避免SQL注入攻击,请考虑使用参数化命令。 您可以在SqlCommand的MSDN文档中找到有关Execute.Scalar和Parametrized命令示例的信息 。