ADODB Excel/Access SQL插入舍入小数:知道为什么或如何修复吗?

ADODB Excel/Access SQL插入舍入小数:知道为什么或如何修复吗?,sql,excel,vba,adodb,Sql,Excel,Vba,Adodb,早上好 我目前正在从事一个项目,我们需要导出一些Excel数据,以便通过VBA访问;我正在Excel中使用VBA,因为我们已经有了一个宏,它可以处理所有格式和其他内容。宏工作正常(数据导入成功),但有一个问题:出于某种原因,某些未知错误(可能在Excel、Access、SQL或ADODB端)将所有十进制数舍入为整数(“整数”)。我在VBA或SQL代码(见下文)中没有使用任何类型的舍入函数,Access中的列有带两位小数的“数字”数据类型(和“常规数字”格式),因此我不知道为什么要舍入。也许ADO

早上好

我目前正在从事一个项目,我们需要导出一些Excel数据,以便通过VBA访问;我正在Excel中使用VBA,因为我们已经有了一个宏,它可以处理所有格式和其他内容。宏工作正常(数据导入成功),但有一个问题:出于某种原因,某些未知错误(可能在Excel、Access、SQL或ADODB端)将所有十进制数舍入为整数(“整数”)。我在VBA或SQL代码(见下文)中没有使用任何类型的舍入函数,Access中的列有带两位小数的“数字”数据类型(和“常规数字”格式),因此我不知道为什么要舍入。也许ADODB对象中的某些东西(我最近才学会使用)需要配置为处理小数之类的东西?或者可能有一种比“数字”更好的数据类型(尽管Access似乎没有进入浮动和双精度等)?我在谷歌上搜索过,没有找到太多关于这个主题的东西;有很多类似的问题,但没有一个真正符合这种情况。因此,一如既往,任何线索都将不胜感激。谢谢

Sub ExportReport()
    Call connect("M:\Matrix\5-Information Technology\1-Knowledge Base\Reporting\Agent Stats.accdb") 'This just connects to the DB and works fine.

    Dim test As String, i As Integer
    Range("A3").Select
    For i = 1 To ActiveSheet.UsedRange.Rows.Count
        If ActiveCell.Value = vbNullString Then Exit For
        test = "INSERT INTO [My Report] " & _
            "([CALL DATE], [CAMPAIGN], [AVG AGENTS], " & _
            "[OFFERED], [ANSWERED], [HANDLE(M)], [AVG HANDLE(M)], " & _
            "[TALK(M)], [AVG TALK(M)], [DISPO(M)], " & _
            "[ABANDONED], [ABAN PCT], [ASA(S)], " & _
            "[SVC LVL PCT], [OUTBOUND], [OUTBOUND(M)], " & _
            "[OVERFLOW], [OVERFLOW(M)]) " & _
        "VALUES('" & _
            ActiveCell.Value & "', '" _
            & ActiveCell.Offset(0, 1).Value & "', '" & ActiveCell.Offset(0, 2).Value & "', '" _
            & ActiveCell.Offset(0, 3).Value & "', '" & ActiveCell.Offset(0, 4).Value & "', '" _
            & ActiveCell.Offset(0, 5).Value & "', '" & ActiveCell.Offset(0, 6).Value & "', '" _
            & ActiveCell.Offset(0, 7).Value & "', '" & ActiveCell.Offset(0, 8).Value & "', '" _
            & ActiveCell.Offset(0, 9).Value & "', '" & ActiveCell.Offset(0, 10).Value & "', '" _
            & ActiveCell.Offset(0, 11).Value & "', '" & ActiveCell.Offset(0, 12).Value & "', '" _
            & ActiveCell.Offset(0, 13).Value & "', '" & ActiveCell.Offset(0, 14).Value & "', '" _
            & ActiveCell.Offset(0, 15).Value & "', '" & ActiveCell.Offset(0, 16).Value & "', '" _
            & ActiveCell.Offset(0, 17).Value & "');"

        DB.Execute test
        ActiveCell.Offset(1, 0).Activate
    Next i

    Call CloseDatabase  'Again, this part works fine
End Sub

SQL INSERT语句小数位数丢失的原因主要有两个

第一:数据库字段的小数位数大小不正确

第二:INSERT语句中的十进制分隔符与数据库十进制分隔符不同

在Access中,可以控制“设计”视图中数字字段的字段大小。对于具有十进制数字的值,它必须是单精度、双精度或十进制。见:

第二种可能性主要发生在生成INSERT语句的系统和承载数据库的系统之间存在不同的语言环境设置时。根据问题中的评论,本案并非如此

问候


Axel

我不知道这是否适用于这个问题,我不明白adodb开发人员没有考虑过这一点


在vba中,使用10100将小数转换为整数。。。然后使用现有查询或excel上传数据并除以access中的移位因子,但下次访问db时速度会变慢

解决这个问题很容易,但需要一些解决方法

在VBA中,查找要导出到数据库的列中的最大位数。假设你有这些数字,1.034;2.42 ; 4.2311 . 所以数字是4

把它调到幂数,10000

在VBA中,将要导出的每列中的所有数字与幂数相乘,即1034;242424231

仅导出带有整整数的数据

然后在VBA子结束之前,对带小数的数字列运行更新查询,并将所有值除以10000,或者使用专用查询或存储过程在数据库中运行更新查询

我在youtube上快速浏览了一下

帕斯卡


我要做的是:
Debug.Print test
。现在看看串联SQL语句真正包含的内容。我怀疑:十进制分隔符并不像预期的那样。是吗?是的,这是我们所期望的(例如5892.25)。我在MsgBox上也尝试过同样的想法(同样的结果),但作为一个附带的感谢,我展示了Debug.Print。我写VBA宏已经有几年了,但我以前从未见过(lol)。如果在设计视图中显示Access表,那么数字字段的字段大小是多少?它必须是单精度、双精度或十进制。瞧,我把它处理好了!果不其然,它被设置为Long。谢谢我仍然是一个在堆栈溢出上的noob。。。我如何给你a+1并将此问题标记为已解决?:)你可以接受我的回答。有公认答案的问题已经解决。答案并没有真正的帮助。在数据库中选择正确的数据类型可以解决问题,如问题注释中所述。