ADO возвращает неправильный порядок величины - PullRequest
1 голос
/ 19 октября 2011

Я пишу макрос VBA для Excel 2003. Я импортирую различные данные из базы данных SQL в таблицы Excel.

Я попытался сделать это двумя способами:

  1. QueryTables.Add(...)
  2. с ADO

Я был за ADO, потому что это казалось "лучшим" или "более чистым" решением.

Все работало хорошо, пока я не попытался вывести числовое значение с помощью ADO из базы данных. Вместо того, чтобы возвращать значение 1842,47078, оно возвращало 0,01842. (Просто чтобы показать, что я имею в виду)

Странная вещь:когда я пробую это с QueryTables.Add(...), я получаю правильное значение.

Я совершенно не понимаю, почему это происходит, искал в Интернете решение, но ничего не нашел. Это просто происходит с числовыми значениями. Еслия получаю строку из базы данных, все в порядке.

Кто-нибудь может мне помочь с этим?

Драйвер - это драйвер Firebird / InterBase (r), соединяющийся с ODBC. Вот небольшой пример того, какЯ делаю вещи:

    'ADO solution = wrong value
    With adoConnection
      .Provider = "MSDASQL"
      sConnection = "ODBC;DSN=ABC;Driver=Firebird/InterBase(r) driver;Dbname=blaName.gdb;"
      ConnectionString = sConnection
      .Open
    End With
    SQL_Import = "SELECT A.PRICE AS ""Price"" FROM TABLE A WHERE A.KEY ='x1234' "
    adoRecordset.ActiveConnection = adoConnection
    adoRecordset.Open SQL_Import
    varSol = adoRecordset.Fields("Price")
    Sheets(3).Cells(1, 1).Value = varSol
    adoRecordset.Close
    adoRecordset.ActiveConnection = Nothing
    adoConnection.Close
    'QueryTables solution = right value
    Set QueryTbl = Sheets(3).QueryTables.Add(Connection:=sConnection, Destination:=Sheets(3).Cells(1, 2))
    With QueryTbl
        .CommandText = SQL_Import
        .AdjustColumnWidth = True
        .Refresh BackgroundQuery:=False
        .Delete
    End With

Я надеюсь, что кто-нибудь может мне помочь.

Обновление:

  • У меня получилось как-то работать, но я не знаю, что было не так.
  • Я получаю правильные результаты, если использую запрос SELECT Price as numeric(15, 2)....
  • Странно то, что я пытался все это с C # на моем компьютере, и это работало без каких-либо проблем.Так что, похоже, ошибка вызвана чем-то в Excel и / или VBA.

Ответы [ 3 ]

1 голос
/ 30 октября 2011

Попробуйте применить NumberFormat к ячейке

varSol = adoRecordset.Fields("Price") 
Sheets(3).Cells(1, 1).NumberFormat = "###0,#######0" 
Sheets(3).Cells(1, 1).Value = varSol 
0 голосов
/ 06 июня 2013

Я не знаю, на самом деле , в чем проблема была / была, но у меня есть решение.Если я изменяю свою строку SQL на

SQL_Import = "SELECT A.PRICE*1  FROM TABLE A WHERE A.KEY ='x1234' "

, все работает, как ожидалось, и я получаю правильный результат.

Таким образом, мое решение умножается на единицу или добавляет ноль.

0 голосов
/ 28 октября 2011

Я ничего не знаю о firebird, но звучит так, как будто речь идет о столбце типа «Деньги» или «Валюта» (то, что ADO называет adCurrency), и вы не сказали ADO об этом, поэтому он не конвертируется должным образом.

Посмотрите на adoRecordset.Fields ("Price"). Напечатайте, и я готов поспорить, вы увидите, что это adCurrency или подобное.

...