【问题标题】:VBA Execution of SQL Stored Procedure Fails with adDecimal DatatypeSQL 存储过程的 VBA 执行因 adDecimal 数据类型而失败
【发布时间】:2019-10-02 13:34:33
【问题描述】:

对于这个让我很困惑的问题,如果能提供任何帮助,我将不胜感激: 我正在尝试从 Access 365 VBA 执行 SQL Server 2008 存储过程,并不断出现“多步 OLE DB 操作生成错误”。 当我将目标表中的列从 int 数据类型更改为 decimal(3,1) 时,此错误开始。 (我现在需要能够在小数点右侧存储一个数字)。

为了进行故障排除/测试,我剥离了存储过程以仅更新此列。 (OCR_Freq 为更新列,OcrxId 为记录id)。

我已经验证/尝试过: 1)表格列设置为十进制(3,1)。 2) 存储过程变量中的数据类型为十进制(3,1)。 3) 存储过程从 SQL Server 执行没有问题 管理工作室。 4) 将列数据类型更改为 decimal(18,4) 无效。 4) 如果 DataType 是,下面的 vba 代码执行没有问题 广告整数。 5)我使用这段代码来执行一些其他的存储过程 没有问题。

'VBA CODE:
Dim Comm As ADODB.Command
Dim lngRecordsAffected As Long
Dim param1 As New ADODB.Parameter
Dim param2 As New ADODB.Parameter
'************************************************
Dim ocrxid As Long
Dim OCR_Freq As Variant
Dim x As Single

'testing the formatting
x = 7.2 'doesn't work
'OCR_Freq = Round(x, 1) 'doesn't work
'OCR_Freq = CDec(x) 'doesn't work
'OCR_Freq = Round(OCR_Freq, 1) 'doesn't work
OCR_Freq = CDec(Format(x, "00.0")) 'doesn't work

'connection stuff
If con.State = adStateClosed Then
    con.ConnectionString = conConnection
    con.Open
End If

Set Comm = New ADODB.Command
With Comm
    .ActiveConnection = con
    .CommandType = adCmdStoredProc
    .CommandText = "up_EOCR_TEST"

    '--- ADD PARAMETERS --------------------------------
    'OCR_Freq decimal(3,1)
    Set param1 = Comm.CreateParameter("@OCR_Freq", adDecimal, 
        adParamInput, , OCR_Freq)
    Comm.Parameters.Append param1
    'test record id
    Set param2 = Comm.CreateParameter("@OcrxId", adInteger, 
        adParamInput, , 8053)
    Comm.Parameters.Append param2

    .Execute lngRecordsAffected
End With
'END VBA CODE

//SQL Stored Procedure:
@OCR_Freq decimal(3,1) = null, 
@OcrxId int = null
as
begin
  UPDATE dbo.OCRX SET OCR_Freq=@OCR_Freq  WHERE OCR_ID=@OcrxId;
END

我得到的错误是“多步 OLE DB 操作生成错误” 以上使我得出结论,我没有正确“准备” vba 中的值以执行存储过程 - adDecimal 对我的变量不满意...... 但我不知道如何前进。任何帮助将不胜感激。

【问题讨论】:

  • 该错误可能与您传递的值有关 (8053)。 decimal(3,1)的实际参数类型最大值为99.9。
  • 感谢您的回复。 Param2 是记录 ID,它可以正常运行。问题肯定出在 param1/ OCR_Freq 变量上。
  • 您使用的是哪个 OLEDB 提供商(版本)?旧版本的 OLEDB 驱动程序可能存在小数问题。
  • 我使用的连接字符串是:ODBC;DRIVER={SQL Server};SERVER=serverName;DATABASE=dbaseName;Trusted_Connection=Yes
  • 我尝试将驱动程序从 SQL Server 更改为 SQL Server Native Client 10.0,但也没有成功。

标签: sql-server vba ms-access stored-procedures


【解决方案1】:

好吧,解决方案让我眼前一亮——我忘了​​在附加参数 1 之前设置 NumericScale 和精度:

'VBA CODE CORRECTED:
Dim Comm As ADODB.Command
Dim lngRecordsAffected As Long
Dim param1 As New ADODB.Parameter
Dim param2 As New ADODB.Parameter
'************************************************
Dim ocrxid As Long
Dim OCR_Freq As Variant
Dim x As Single

'testing the formatting
x = 7.5
OCR_Freq = x

'connection stuff
If con.State = adStateClosed Then
    con.ConnectionString = conConnection
    con.Open
End If

Set Comm = New ADODB.Command
With Comm
    .ActiveConnection = con
    .CommandType = adCmdStoredProc
    .CommandText = "up_EOCR_TEST"

    '--- ADD PARAMETERS ---------------------------------------------------
    'OCR_Freq decimal(3,1)
    Set param1 = Comm.CreateParameter("@OCR_Freq", adDecimal, adParamInput, , 
OCR_Freq)
    param1.NumericScale = 1
    param1.Precision = 3
    Comm.Parameters.Append param1

    Set param2 = Comm.CreateParameter("@OcrxId", adInteger, adParamInput, , 
8053)
    Comm.Parameters.Append param2

    .Execute lngRecordsAffected
End With

【讨论】:

  • 这对我有用。我整天都在挣扎,找不到问题所在。看完这篇文章,我终于知道decimal类型是罪魁祸首
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多