Я запрашиваю SQL Сервер из VBA, используя ADODB. Все мои таблицы имеют столбцы RowVersion (timestamp / varbinary). Поскольку VBA не поддерживает тип varbinary, я конвертирую RowVersion в строку из SQL серверной функции. Простой запрос будет выглядеть так:
sql = "SELECT NameValueListID, dbo.RowVersionToString(RowVersion) AS RowVersion FROM NameValueLists WHERE NameValueListID=1
Чтобы получить данные на лист, я сначала попробовал range.CopyFromRecordset. Это работало, пока я не включил вышеупомянутую функцию в вызов sql. Добавление функции RowVersionToString заставило набор записей вернуть то, что кажется случайным набором данных - меньше строк, чем исключено, и меньше столбца, чем я просил. Никогда не мог понять это. Затем я использовал rs.GetRows, который возвращал ожидаемые данные, и я мог успешно использовать range.value = rsData. Ниже приведен пример вызова, который работает.
Private Sub Test_Scratch()
Dim rs As ADODB.Recordset
Dim sqlCmd As New ADODB.Command
Dim sqlConnection As ADODB.Connection
Dim sql As String
Dim rsData() As Variant
Set sqlConnection = New ADODB.Connection
sqlConnection.Open ModSQL.GetConnectionStringByStage(wsSetup.Range("suAppStage"))
sql = "SELECT NameValueListID, dbo.RowVersionToString(RowVersion) AS RowVersion FROM NameValueLists WHERE NameValueListID=1"
Set sqlCmd.ActiveConnection = sqlConnection
sqlCmd.CommandText = sql
Set rs = sqlCmd.Execute
rs.MoveFirst
rsData = rs.GetRows
End Sub
Затем я добавил второй столбец varbinary в запрос (это не RowVersion, но того же типа). Таким образом, sql будет выглядеть следующим образом:
sql = "SELECT NameValueListID, dbo.RowVersionToString(RowVersion) AS RowVersion, dbo.RowVersionToString(LastItemRowVersion) AS LastItemRowVersion FROM NameValueLists WHERE NameValueListID=1
После вызова набор записей rs содержит все данные, но rsData имеет значение «Пусто» для первого столбца varbinary. Порядок не имеет значения. Только последний столбец varbinary имеет значение, другой всегда «пустой» в массиве rsData.