Я вытаскиваю большой набор записей с сервера MySQL и назначаю кучу переменных в программе Excel VBA на основе позиции поля, например:
x = MyRecordset.Fields(0).Value
y = MyRecordset.Fields(1).Value
' etc...
Единственный раз, когда это вызывает ошибку, является одно из значений NULL, потому что VBA не допускает, чтобы строка была NULL. У меня есть вопрос для обеих сторон: VBA и MySQL, если сторона VBA падает:
VBA: В настоящее время я использую On Error Resume Next
чтобы пропустить ошибку NULL - есть ли лучший или более официальный способ достичь этого? Пропущена ли эта ошибка, замедляя мой код?
MySQL: Есть ли способ предотвратить отправку "NULL", например, чтобы быстро заменить экземпляры NULL пустой строкой в моей SELECT
?
Используйте такую функцию
Option Explicit
Function rcdString(rcdField As Variant) As String
If IsNull(rcdField) Then
rcdString = ""
Else
rcdString = rcdField.Value
End If
End Function
А также
x = rcdString(MyRecordset.Fields(0))
Как это сделать:
1 - на стороне VBA
Если я не ошибаюсь, уже существует функция VBA, которая выполняет задание преобразования нулей в значения по умолчанию. В вашем случае это будет
Nz(MyRecordset.Fields(1).Value,"")
Возврат строки нулевой длины, если значение поля равно null.
2 - на стороне MYSQL
Вы можете использовать функцию COALESCE, которая отбрасывает первое ненулевое значение в свой список параметров. Затем ваш выбор будет выглядеть так:
SELECT COALESCE(myFieldName,'')
Nz()
видимому, работает только в Access, и я использую Excel - полезно, хотя, так как я выполнил поиск и увидел хороший фрагмент для воссоздания его на основе IIF()
- как для идеи COALESCE()
, также отлично, я проведу несколько тестов скорости, используя оба, чтобы увидеть, какой из них быстрее - я думаю, что пост-запрос обработки в Excel мог бы быть быстрее и возложить «CPU» на пользовательское приложение, а не на сервер.
Если я правильно помню, если у вас есть переменная, которая может содержать null, объединение пустой строки превратит эту переменную в пустую строку, не влияя на какое-либо другое значение. Но это может не работать с наборами записей ADO
x = MyRecordset.Fields(0).Value & ""