#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 Нет проблем. Не стесняйтесь голосовать и / или отмечать как отвеченный.