ADO返回错误的数量级

问题描述 投票:1回答:3

我正在为Excel 2003编写VBA宏。我正在将各种数据从sql数据库导入Excel工作表。

我尝试了两种方法:

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

我赞成ADO,因为它似乎是“更好”或“更清洁”的解决方案。

一切顺利,直到我试图从数据库中获取ADO的数值。而不是返回值1842,47078它返回0,01842。 (只是为了表明我的意思)

奇怪的是:当我用QueryTables.Add(...)尝试时,我得到了正确的价值。

我完全不知道为什么会发生这种情况,在互联网上搜索解决方案但没有找到任何结果。它恰好发生在数值上。如果我从数据库中获取一个字符串,一切都很好。

任何人都可以帮我这个吗?

驱动程序是与ODBC连接的Firebird / InterBase(r)驱动程序。这是我做事的一个小例子:

    '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中的任何内容引起的。
vba ado firebird
3个回答
1
投票

尝试将NumberFormat应用于单元格

varSol = adoRecordset.Fields("Price") 
Sheets(3).Cells(1, 1).NumberFormat = "###0,#######0" 
Sheets(3).Cells(1, 1).Value = varSol 

0
投票

我对firebird一无所知,但听起来有问题的列是Money或Currency类型(ADO称之为adCurrency)并且你没有告诉ADO这个,所以它没有适当地转换它。

看看adoRecordset.Fields(“Price”)。输入,我打赌你会看到它是adCurrency等。


0
投票

我真的不知道问题是什么,但我有一个解决方案。如果我改变我的SQL字符串

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

一切都按预期工作,我得到了正确的结果。

所以我的解决方案是乘以1或加零。

© www.soinside.com 2019 - 2024. All rights reserved.