System.IndexOutOfRangeException:索引超出数组范围
问题描述:
我正在开发一种ATM软件作为家庭作业,其中我想知道今天处理的事务总量,为此,我正在写下面的代码System.IndexOutOfRangeException:索引超出数组范围
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;
}
}
但我得到异常System.IndexOutOfRangeException:索引是该数组的范围之外,但在数据库中的多个记录,它们有越来越运行在查询窗口相同的查询。但我不知道如何通过编码来获得它。
请帮帮我。
Regards
答
那是因为你想读取太多列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注入攻击,请考虑使用参数化命令。您可以在MSDN Documentation for SqlCommand中找到有关Execute.Scalar和Parametrized命令示例的信息。
您应该使用[参数化SQL](http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlparameter.aspx)。 – 2012-01-01 12:21:47