我正在尝试使用以下查询获取数据库值并绑定到数据表
sql = @"SELECT member_Id, 30*memberToMship_ChargePerPeriod / DateDiff(memberToMship_EndDate,
memberToMship_StartDate) As monthlyamount,
PERIOD_DIFF(DATE_FORMAT(now(),'%Y%m'),
DATE_FORMAT(memberToMship_StartDate,'%Y%m')) + (DAY(memberToMship_StartDate) < memberToMship_DueDay)+ (DAY(now()) > memberToMship_DueDay)-1 AS ExpPayments,
SUM(memberToMship_InductionFee+memberToMship_JoinFee+
(IF(mshipOption_Period='year',
TIMESTAMPDIFF (YEAR ,memberToMship_StartDate, memberToMship_EndDate),
TIMESTAMPDIFF (MONTH ,memberToMship_StartDate, memberToMship_EndDate)) * memberToMship_ChargePerPeriod)) as value
FROM membertomships
INNER JOIN mshipoptions on membertomships.mshipOption_Id = mshipoptions.mshipoption_Id";
这是我从数据库获取数据的代码
string memberid;
double value = 0.0;
double expectedpayment=0.0;
double monthlypayamount=0.0;
int dueday = 0;
dt = xxxxxx.GetData(sql, mf);
if (dt != null && dt.Rows.Count > 0)
{
memberid = Convert.ToInt32(dt.Rows[0]["member_Id"]).ToString();
monthlypayamount = Convert.ToDouble(dt.Rows[1]["monthlyamount"]);
expectedpayment = Convert.ToDouble(dt.Rows[2]["ExpPayments"]);
value = Convert.ToDouble(dt.Rows[3]["value"]);
}
但是我收到了错误
“索引超出范围异常”
和这样的错误
“位置1没有行”
请有人帮忙解决这个问题......
答案 0 :(得分:6)
如果要从返回的第一行获取所有数据,则应在每行代码上对Rows使用index [0]。如果您使用行[1]和行[2]等,那么您正在查看第二行和第三行等,如果您的查询仅返回一行数据,则该行无效。
答案 1 :(得分:1)
您正在检查
dt.Rows.Count > 0
然后访问行0,1,2和3,而不检查是否所有这些行都存在。我认为你把行号与列混淆了,应该尝试
memberid = Convert.ToInt32(dt.Rows[0]["member_Id"]).ToString();
monthlypayamount = Convert.ToDouble(dt.Rows[0]["monthlyamount"]);
expectedpayment = Convert.ToDouble(dt.Rows[0]["ExpPayments"]);
value = Convert.ToDouble(dt.Rows[0]["value"]);
答案 2 :(得分:1)
if (dt != null && dt.Rows.Count > 0)
{
memberid = Convert.ToInt32(dt.Rows[0]["member_Id"]).ToString();
monthlypayamount = Convert.ToDouble(dt.Rows[1]["monthlyamount"]);
expectedpayment = Convert.ToDouble(dt.Rows[2]["ExpPayments"]);
value = Convert.ToDouble(dt.Rows[3]["value"]);
}
您的if语句仅检查是否存在1行或更多行。但是,当您设置monthlypayamount
时,您假设第二行(dt.Rows[1]["monthlyamount"]
)。我认为你需要使用foreach循环来迭代结果
foreach(DataRow row in dt.Rows)
{
memberid = Convert.ToInt32(row["member_Id"]).ToString();
monthlypayamount = Convert.ToDouble(row["monthlyamount"]);
expectedpayment = Convert.ToDouble(row["ExpPayments"]);
value = Convert.ToDouble(row["value"]);
//logic here to use variable values before moving to next row
}
这将确保您可以访问所有行
答案 3 :(得分:0)
您似乎尝试访问row 1
,但row 1
不存在。因此,您的查询似乎只返回一行row 0
。尝试
if (dt != null && dt.Rows.Count > 0)
{
memberid = Convert.ToInt32(dt.Rows[0]["member_Id"]).ToString();
monthlypayamount = Convert.ToDouble(dt.Rows[0]["monthlyamount"]);
expectedpayment = Convert.ToDouble(dt.Rows[0]["ExpPayments"]);
value = Convert.ToDouble(dt.Rows[0]["value"]);
}