2010-10-25 5 views
1

У нас есть набор данных dsActualCost, который извлекает значение запроса: MonthName в одну колонку и Стоимость в другой.
У нас есть код для отображения данных в формате таблицы.Row оленья кожа существует в db- Exception

For MonthIndex = 0 To dsMonth.Tables(0).Rows.Count - 1 
    Dim tdMonthlycost As New TableCell 
    If dsActualCost.Tables(0).Rows.Count > 0 Then 
    If IsDBNull(dsActualCost.Tables(0).Rows(MonthIndex).Item(1)) Then   
      tdMonthlycost.Text = 0 
     Else 
      tdMonthlycost.Text = dsActualCost.Tables(0).Rows(MonthIndex).Item(1) 
     End If 
    Else 
     tdMonthlycost.Text = 0 
    End If 
     trBody.Cells.Add(tdMonthlycost) 
    Next 

Этот код работает отлично, когда
у нас есть данные по всем строкам
мы не имеем никаких данных на всех

Но это дает исключение для всех остальных случаев. Я пытался отлаживать и выдавать возникающие проблемы при поиске любой строки, недоступной в БД.

Произнесите набор данных имеет только 2 строки для фев месяц, поэтому, когда он выполняет линию
IsDBNull (dsActualCost.Tables (0) .Rows (2) .Item (1))
Он бросает Db нулевое исключение.

, пожалуйста, предложите, как я должен обращаться с ним. цикл будет работать в течение 12 месяцев.

ответ

0

Вот код сейчас. Дайте мне знать, если у вас есть какие-либо предложения:

Dim Flag As Integer = 0 
For MonthIndex = 0 To dsMonth.Tables(0).Rows.Count - 1 
Dim tdMonthly As New TableCell 
    Dim CostMonth As Integer 
    Dim CostValue As Integer 
    If (dsActualCost.Tables(0).Rows.Count > 0) Then 
      If (Flag <> dsActualCost.Tables(0).Rows.Count) Then 
       CostMonth = dsActualCost.Tables(0).Rows(Flag).Item(1) 
       CostValue = dsActualCost.Tables(0).Rows(Flag).Item(0) 
       If (dsMonth.Tables(0).Rows(MonthIndex).Item(0) = CostMonth Or (dsMonth.Tables(0).Rows(MonthIndex).Item(0) - 1 = CostMonth)) Then 
         tdMonthly.Text = CostValue 
         Flag = Flag + 1 
       Else 
         tdMonthly.Text = 0 
        End If 
      Else 
        tdMonthly.Text = 0 
      End If 
     Else 
      tdMonthly.Text = 0 
     End If 
     trBody.Cells.Add(tdMonthly) 
Next 

Месяц в dsMonth наборе представляет собой целое число и показывает только четное число (например, январь-2, февраль-4 и т.д.). Но месяц в dsActual показывает один из 1,2 для Jan и 3,4 для feb. Именно по этой причине я положил

If (dsMonth.Tables(0).Rows(MonthIndex).Item(0) = CostMonth 
    Or (dsMonth.Tables(0).Rows(MonthIndex).Item(0) - 1 = CostMonth)) 

Пожалуйста, дайте мне знать ваши предложения, если они есть.

1

Вы не должны проверять:

If dsActualCost.Tables(0).Rows.Count > 0 And 
    MonthIndex < dsActualCost.Tables(0).Rows.Count 

Без этой проверки, вы можете индексировать из массива Rows, если MonthIndex относится к положению, которое не присутствует.

+0

Если цикл monthIndex достигает 2, а набор данных dsActualCost имеет значение только для сентября, октября и ноября (нет данных за предыдущие месяцы), цикл отобразит эти данные в январе, феврале и марте. Другие месяцы покажут 0. – RMN

+0

@ RMN. Вам все еще нужно проверить, чтобы MonthIndex не находился за пределами диапазона в dsActualCost. Вы сказали, что получаете исключение, и это может быть причиной. Если вы индексируете массив, это вызовет исключение. – dcp

+0

Да, вы правы, и то, как вы сказали, также верно. Но когда я хочу поместить данные месяца jan в первую ячейку и апрель в 4-й ячейке. Какую петлю я должен использовать? Цикл, который вы сказали, не позволит исключать. Но когда я хочу забрать стоимость за определенный месяц, то как мне следует продолжить? – RMN

Смежные вопросы