Извлечение Oracle LONG в строку в VBA - PullRequest
1 голос
/ 02 ноября 2011

У меня проблемы с получением поля LONG из базы данных в мое приложение Excel (VBA + ADO). Интересно, кто-нибудь может помочь?

Это никак не влияет (приведение к строке или нет):

myString = dataset!long_field

Я попробовал метод GetChunk, который должен делать то, что я надеюсь:

myString = CStr(dataset!long_field.GetChunk(1000))

Это что-то получает, но я ожидаю не тех данных (обычно это какой-то искаженный беспорядок). Что странно, если я попробую запустить это в окне Immediate, пока я прохожу код, я получаю что-то обнадеживающее:

Debug.Print CStr(dataset!long_field.GetChunk(1000))
 e l l o  W o r l d !

Я не знаю, почему это (вроде) работает в окне «Немедленно», а не где-либо еще. Также примечание:

  • Похоже, что Oracle использует какую-то 2-байтовую кодировку, поэтому есть странное расстояние

  • Часть данных с начала отсутствует; это должно читаться как "Hello World!"

Мой другой план атаки заключался в написании функции на стороне базы данных для преобразования long в varchar2. К сожалению, это также не удалось, потому что таблица, к которой мне нужно получить доступ, находится за пределами моей схемы, и у меня нет соответствующих прав для выбора данных из функции (Oracle жалуется, что таблица не найдена).

Так что я отчасти заблудился :( Есть идеи?

Ответы [ 2 ]

1 голос
/ 03 ноября 2011

Это работает для меня:

Debug.Print BinaryToString(RS.Fields("long_raw").Value)

Где «RS» - это набор записей ADO, содержащий результаты запроса, а «BinaryToString» - как показано ниже.

Function BinaryToString(Binary)
  'Antonin Foller, http://www.motobit.com
  'Optimized version of a simple BinaryToString algorithm.

  Dim cl1, cl2, cl3, pl1, pl2, pl3
  Dim L
  cl1 = 1
  cl2 = 1
  cl3 = 1
  L = LenB(Binary)

  Do While cl1 <= L
    pl3 = pl3 & Chr(AscB(MidB(Binary, cl1, 1)))
    cl1 = cl1 + 1
    cl3 = cl3 + 1
    If cl3 > 300 Then
      pl2 = pl2 & pl3
      pl3 = ""
      cl3 = 1
      cl2 = cl2 + 1
      If cl2 > 200 Then
        pl1 = pl1 & pl2
        pl2 = ""
        cl2 = 1
      End If
    End If
  Loop
  BinaryToString = pl1 & pl2 & pl3
End Function
0 голосов
/ 02 ноября 2011

Оказывается, что GetChunk работает: я провел некоторое тестирование в песочнице и, несмотря на странное кодирование, он возвращает все нужные мне данные.Поэтому я не знаю, почему данные искажаются в моем основном запросе;поэтому мое решение состоит в том, чтобы просто использовать функцию, которая получает длинные данные - и декодирует их - и вызывать ее при необходимости, а не включать данные в основной запрос.

...