Выполнение VBA хранимой процедуры SQL завершается неудачно с типом данных adDecimal - PullRequest
0 голосов
/ 15 мая 2019

Буду признателен за любую помощь по этой проблеме, которая поставила меня в тупик: Я пытаюсь выполнить хранимую процедуру SQL Server 2008 из Access 365 VBA и вывести из строя сообщение об ошибке «Ошибки, вызванные многоэтапной операцией OLE DB». Эта ошибка началась, когда я изменил столбец в целевой таблице с типа данных int на десятичный (3,1). (Теперь мне нужно сохранить одну цифру справа от десятичной дроби).

Для устранения неполадок / тестирования я сократил хранимую процедуру, чтобы обновить только этот столбец. (OCR_Freq - столбец обновления, OcrxId - идентификатор записи).

Я подтвердил / попробовал: 1) Столбец таблицы имеет десятичное значение (3,1). 2) Тип данных в переменной хранимой процедуры является десятичным (3,1). 3) хранимая процедура выполняется без проблем с SQL Server Студия управления. 4) Изменение типа данных столбца на десятичное (18,4) не дало эффекта. 4) приведенный ниже код VBA выполняется без проблем, если DataType adInteger. 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 не удовлетворен моей переменной ... но я в растерянности, как двигаться вперед. Любая помощь будет оценена.

1 Ответ

1 голос
/ 15 мая 2019

Что ж, решение смотрело мне в лицо - я забыл установить NumericScale и точность на param1, прежде чем добавить его:

'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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...