Как продолжить цикл for для следующего запроса, даже если предыдущий запрос содержит ошибку?

#vb.net

#vb.net

Вопрос:

Это VB.NET кодирование для извлечения набора баз данных из 100 баз данных с полем «флаг». Я хочу выполнить этот запрос select во всех базах данных, содержащихся в массиве dbs.

 For i = 0 To dbs.Count
    Sql = " select company, branch, year, flag from "   dbs(i)   ".global"
    
    Try
        With Cmd
            .CommandText = Sql
            .Connection = MyCnn
        End With
    Catch ex As MySqlException
        ' do nothing
    End Try

    Dim reader1 As MySqlDataReader = Cmd.ExecuteReader()
    If (reader1("flag").ToString() = "10") Then
        MyDbList.Company = reader1("company")
        MyDbList.Branch = reader1("branch")
        MyDbList.Year = reader1("year")
        MyDbList.DbName = reader("Database")
    End If
 

Комментарии:

1. В чем смысл вашего Try...Catch блока? Там нет кода, который мог бы вызвать исключение. Возможно, вам следует поместить код, который действительно может вызвать исключение внутри Try блока.

2. Вы также можете рассмотреть возможность закрытия программы чтения данных. Может быть, вы уже есть, и вы просто не показали это. Если нет, сделайте это.

3. Ваш цикл For выйдет за пределы конца dbs. Это должно быть For i = 0 To dbs.Count - 1

4. Что такое MyDbList ? Откуда reader берется? Работает ли этот код? Если нет, какие ошибки вы получаете? Вы подключаетесь напрямую к серверу, а не к отдельной базе данных? Соединение выполнено успешно? Является ли глобальным имя таблицы в каждой из баз данных?

Ответ №1:

Если вы хотите прервать текущую итерацию цикла и перейти сразу к следующему, вы можете использовать Continue ключевое слово. Предполагая, что вы действительно пишете разумный обработчик исключений, вы можете вставить Continue For Catch блок.

Комментарии:

1. Документ MS довольно Continue [Do|For|While] понятен.

2. @SteveCinq, я не уверен, пытаетесь ли вы что-то подразумевать этим комментарием или просто сообщаете нам, что документация понятна, что кажется несколько излишним.

3. Я предоставляю ссылку на пояснительный документ. Не лишнее, ничего «подразумеваемого». (Вы подразумеваете, что я что-то подразумеваю?)

4. @SteveCinq, я спрашивал, должен ли я выводить значение. Кризис предотвращен.

5. Фух! Слишком близко для комфорта.

Ответ №2:

Исходя из того, что подразумевал @jmcilhinney, это должно сработать …

 For i As Integer = 0 To dbs.Count - 1
    Try
        Sql = $"select company, branch, year, flag from {dbs(i)}.global"

        With Cmd
            .CommandText = Sql
            .Connection = MyCnn
        End With

        Using reader1 As MySqlDataReader = Cmd.ExecuteReader()
            If (reader1("flag").ToString() = "10") Then
                With MyDbList
                    .Company = reader1("company")
                    .Branch = reader1("branch")
                    .Year = reader1("year")
                    .DbName = reader1("database")
                End With
            End If
        End Using
    Catch ex As MySqlException ' Other exception types won't be caught by this Catch!
        ' Maybe log something somewhere?
        Continue For
    End Try
Next i
 

Обратите внимание на использование Using и интерполяцию строк и исправление For диапазона цикла в соответствии с комментарием @Mary. Как всегда, включите Option Strict и Option Explicit включите — и, ИМХО, Option Infer выключите — чтобы выделить любые проблемы с компиляцией.

Наконец, чтобы было ясно, я бы не так это закодировал; Я только пытаюсь ответить на ваш вопрос здесь.

Комментарии:

1. Смотрите Мой комментарий к OP.

2. @Mary согласился и исправил. Лично я бы, вероятно, пошел на a For Each , если это возможно в этом сценарии.

3. Это никогда не вызывается reader.Read() , что означает, что первая строка никогда не загружается.

4. Большое спасибо, мистер Стив!

5. @MariappanGnanaraj Нет проблем. Не стесняйтесь голосовать и / или отмечать как отвеченный.