试图从数据库中获取数据并将其加载到datatable中会出现异常

时间:2011-07-12 11:16:15

标签: c# datatable datarow

我正在尝试使用以下查询获取数据库值并绑定到数据表

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没有行”

请有人帮忙解决这个问题......

4 个答案:

答案 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"]);            
}