Я пишу макрос VBA для Excel 2003. Я импортирую различные данные из базы данных SQL в таблицы Excel.
Я попытался сделать это двумя способами:
QueryTables.Add(...)
- с 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.