ADO返回错误的数量级

时间:2011-10-19 07:59:50

标签: vba ado firebird

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

我尝试了两种方法:

  1. QueryTables.Add(...)
  2. with ADO
  3. 我支持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中的任何内容引起的。

3 个答案:

答案 0 :(得分:1)

尝试将NumberFormat应用于单元格

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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

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