Как продолжить вставку в случае сбоя одной строки - PullRequest
0 голосов
/ 14 декабря 2011

У меня есть цикл while, где он выбирает запись из csv и вставляет в таблицу sql.Теперь CSV может содержать много строк.

Что мне нужно, если одна строка не удалась, просто войдите в файл и переходите к следующей записи.Я думал о попытке поймать, но это выйдет из программы.Итак, какие-либо предложения?

while (csv.readnextline)
'assign csv columns to objects
try
'insert to db
Catch ex As Exception
'write to log file
End Try

Мне нужно, чтобы вышеуказанный код продолжался после перехвата исключения.

Ответы [ 2 ]

3 голосов
/ 14 декабря 2011

Try и catch не выходят из программы, они просто контролируют поток кода на случай, если произойдет что-то исключительное.

Когда в блоке try происходит исключение, выполнение продолжается в первой строке(соответствующий) блок catch.После выполнения блока catch код продолжается в первой строке после перехвата, который в вашем случае может быть End While, который продолжит цикл.
Таким образом, такая конструкция

While dr.Read
  Try
    InsertRowIntoDataBase()
  Catch ex As Exception
    LogErrorToFile(ex)
  End Try
End While

должно работать для вас.
Однако это плохой дизайн, поскольку он будет генерировать и регистрировать исключение, независимо от того, в чем заключается проблема, являются ли данные недействительными, или сервер sql не работает, или даже еслив вашем коде есть ошибка (например, скрывается исключение NullReferenceException).Вы должны ограничить обработку исключений конкретным случаем, например, проблемой с базой данных, например:

While dr.Read
  Try
    InsertRowIntoDataBase()
  Catch ex As SqlClient.SqlException
    LogDataBaseErrorToFile(ex)
  End Try
End While

Также, если есть известные возможные проблемы с данными (например, строка в CSVгде ожидается целое число) лучше просто проверить это, чем использовать механизм исключения, что-то вроде этого:

While dr.Read
  Try
    If Not IsRowValid() Then
      LogInvalidDataToFile()
      Continue While
    End If
    InsertRowIntoDataBase()
  Catch ex As SqlClient.SqlException
    LogDataBaseErrorToFile()
  Catch ex As Exception
    LogGenericErrorToFile()
  End Try
End While
0 голосов
/ 14 декабря 2011

нет, она не выйдет из программы, в зависимости от того, как / где вы обрабатываете исключение.Если вы делаете что-то вроде:

Dim WrongValuedLinesList As New List(Of String)
Dim ConversionFailedList As New List(Of String)
Dim InsertionFailedList As New List(Of String)
Dim NumberOfInsertedLines As integer = 0

For Each  (CurrentLine in my csv)
  ' 1. line processing
  Try
    ' (process my line : split, convert, check range...)
    If (I know the insertion will fail) Then
      ' (Store information about that wrong line, in List, log, or do nothing)
        WrongValuedLinesList.Add(" This line : " & CurrentLine 
                                              & " has wrong values because... 
        Continue For
    End If
  Catch ex as exception
    ' (here handle the line conversion failed : store in list, or log, or do nothing ...)
    ' for expl :   
       ConversionFailedList.Add(" Conversion failed for line " & CurrentLine 
                                      & " exception details : " & ex.message " )
  End Try
  ' 2. Line insertion
  Try
    '(insert my processed data into database)
     NumberOfInsertedLines +=1
  Catch ex as exception
    ' (here handle the insertion failed exception (expl : primary key might not be unique)
    '                      : store in list, log, do nothing...)
    ' for example :
    InsertionFailedList.Add(" Insertion failed for line " & CurrentLine 
                                      & " exception details : " & ex.message " )
  End Try
 Next

 (Here you might wanna report how things went to your user using
    your error list.)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...