【问题标题】:Arithmetic overflow error converting varchar to data type numeric -VBA将varchar转换为数据类型数字-VBA的算术溢出错误
【发布时间】:2018-12-02 08:34:41
【问题描述】:

我正在尝试使用文本文件作为输入从 SQL Server 获取数据,但出现错误:

将 varchar 转换为数据类型 numeric 的算术溢出错误

如果以下代码错误或需要添加其他内容,请告诉我:

Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim ConnectionString As String
Dim StrQuery As String
Dim iCols As Integer
Dim X As Double
Dim TXT As String
Dim Y As String
Dim A As Double

strcon = "Provider=SQLOLEDB;Data Source=SERVER1;Initial Catalog=MYDB;Integrated Security=SSPI;"
cnn.Open strcon
cnn.CommandTimeout = 900

Open "C:\Users\Gaurav.Shrivastava\Desktop\SLIp\New folder\TESTING.txt" For Input As 1
X = 0

Do While Not EOF(1)
    Line Input #1, TXT
    Y = Val(TXT)
    A = Y
    StrQuery = "Select * from FRA_RETAIL where COM_A_NO=" & A & ""
    rst.Open StrQuery, cnn
    X = X + 1
Loop

For iCols = 0 To rst.Fields.Count - 1
    Worksheets("Sheet1").Cells(1, iCols + 1).Value = rst.Fields(iCols).Name
Next

Sheets(1).Range("A2").CopyFromRecordset rst
'rst.Close
'cnn.Close
'Set rst = Nothing
'ActiveWorkbook.Close SaveChanges:=True
'Application.Quit

'Application.ActiveWindow.Close

【问题讨论】:

  • 我认为问题来自where COM_A_NO=" & A & "" 导致A 的字符串值无法转换为numeric
  • 我也试过了,但收到同样的错误:StrQuery = "Select * from FRA_RETAIL where COM_A_NO"= & A
  • 请建议我如何纠正它
  • 我也尝试过 CINT 函数将值存储到整数中,但收到错误为 OVERFLOW,如 A(AS INTEGER) = CINT(TXT)
  • 我也会考虑对您的查询进行参数化。

标签: sql sql-server vba


【解决方案1】:

您的输入文件中似乎存在无效数据。最好的做法是清理数据或在执行查询之前检查值。此外,您的代码容易受到 SQL 注入的攻击。如果这个文件中有一行包含9; delete from FRA_RETAIL; --怎么办?

对于此类查询,您应该使用parameters(假设 COM_A_NO 为十进制(18,0)):

Sub ProcessLine(ByRef A As String)

    Dim Cn As ADODB.Connection
    Dim Cm As ADODB.Command
    Dim Pm As ADODB.Parameter
    Dim Rs as ADODB.Recordset

    Set Cn = New ADODB.Connection
    Cn.Open "Provider=SQLOLEDB;Data Source=SERVER1;Initial Catalog=MYDB;Integrated Security=SSPI;"
    Set Cm = New ADODB.Command
    With Cm
        .ActiveConnection = Cn
        .CommandText = "Select * from FRA_RETAIL where COM_A_NO=TRY_CAST(? as DECIMAL(18,0));"
        .CommandType = adCmdText

        Set Pm = .CreateParameter("no", adVarChar, adParamInput, 200, A)

        .Parameters.Append Pm

        Set Rs = .Execute
    End With

End Sub

此外,强烈建议在您的代码中添加一些错误处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多