Я пишу макрос VBA для Excel 2003. Я импортирую различные данные из базы данных sql в листы Excel.
Я попробовал два способа сделать это:
QueryTables.Add(...)
- с АДО
Я был за 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.
varSol
Variant
, как следует из префикса? Будет ли иначе, если вы напишетеvarSol = CStr(adoRecordset.Fields("Price"))
, а затем проверите значениеvarSol
? - person barrowc   schedule 23.10.2011