Попытка получить данные из базы данных и загрузить их в datatable получил исключение - PullRequest
1 голос
/ 12 июля 2011

Я пытаюсь получить значения базы данных и привязку к таблице данных, используя следующий запрос

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 ]

6 голосов
/ 12 июля 2011

Вы должны использовать индекс [0] для строк в каждой строке кода, если вы хотите получить все данные из первой строки, которая была возвращена.Если вы используете строки [1] и строки [2] и т. Д., То вы просматриваете вторую строку и третью строку и т. Д., Что недопустимо, если ваш запрос вернул только одну строку данных.

1 голос
/ 12 июля 2011
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
}

Это обеспечит вам доступ ко всем строкам

1 голос
/ 12 июля 2011

Вы проверяете на

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"]);      
0 голосов
/ 12 июля 2011

Кажется, что вы пытаетесь получить доступ к 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"]);            
} 
...