Хранимая процедура из VBA Excel не работает - PullRequest
0 голосов
/ 31 января 2019

Я звоню из VBA хранимой процедуры с ПК, и она работает нормально.На другом ПК и другом пользователе это не работает.Однако один запрос работает на обоих компьютерах.

Я вызываю хранимую процедуру следующим образом:

Dim rst As New ADODB.Recordset
Dim ConnectionString As String
Dim StrQuery As String

' Connection string for accessing MS SQL database
ConnectionString = <Connection details>

' Opens connection to the database
cnn.Open ConnectionString
' Timeout error in seconds for executing the entire query; The stored procedure normally runs for around 20 min
cnn.CommandTimeout = 2400

' Process execution
StrQuery = "exec [00_Main] @date = '01/31/2018' "
rst.Open StrQuery, cnn
rst.Close

Я предполагаю, что при выполнении сообщения появляется сообщение об ошибке.хранимая процедура, но я не знаю, как ее перехватить.

Я попробовал следующее, но ничего не получаю в качестве вывода

' Process execution
StrQuery = "exec [00_Main] @date = '01/31/2018' "
rst.Open StrQuery, cnn
Debug.Print rst.Fields.Count
Debug.Print rst.RecordCount
Debug.Print rst
rst.Close

Когда я запускаю хранимую процедурув студии SQL Management я просто получаю выходные сообщения, поскольку хранимая процедура просто обновляет таблицы.Например:

(29145907 rows affected)
(330527 rows affected)

Я также пытался добавить информацию об ошибках по ссылке здесь , но процесс запускается без каких-либо ошибок.Как:

' Process execution
DateSelection = Sheets("STB Check").Range("F1")
'StrQuery = "exec [00_Main] @date = '" & DateSelection & "' "
StrQuery = "exec [00_Main] @date = '01/31/2018' "
rst.Open StrQuery, cnn

Done:
rst.Close
Exit Sub

AdoError:

  Dim errLoop As Error
  Dim strError As String

  i = 1

' Process
 StrTmp = StrTmp & vbCrLf & "VB Error # " & Str(Err.Number)
 StrTmp = StrTmp & vbCrLf & "   Generated by " & Err.Source
 StrTmp = StrTmp & vbCrLf & "   Description  " & Err.Description

' Enumerate Errors collection and display properties of
' each Error object.
 Set Errs1 = cnn.Errors
 For Each errLoop In Errs1
      With errLoop
        StrTmp = StrTmp & vbCrLf & "Error #" & i & ":"
        StrTmp = StrTmp & vbCrLf & "   ADO Error   #" & .Number
        StrTmp = StrTmp & vbCrLf & "   Description  " & .Description
        StrTmp = StrTmp & vbCrLf & "   Source       " & .Source
        i = i + 1
   End With
Next

  MsgBox StrTmp

  ' Clean up Gracefully

  On Error Resume Next
  GoTo Done

Есть идеи?

1 Ответ

0 голосов
/ 31 января 2019

Используйте правильную параметризацию и обрабатывайте даты как Date, а не как строки.

Вместо того, чтобы сразу же запускать ADODB.Recordset, используйте ADODB.Command;установите в тексте команды только имя хранимой процедуры и добавьте ADODB.Parameter в ее коллекцию Parameters, предоставив значение ячейки (после проверки того, что IsDate возвращает True для этого значения ячейки) - как на docs.microsoft.com :

Dim theDate As Date
theDate = Sheets("STB Check").Range("F1").Value

Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
Set cmd.ActiveConnection = cnn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "[00_Main]"

Dim dateParam As ADODB.Parameter
Set dateParam = cmd.CreateParameter("date", adDate, adParamInput)
dateParam.Value = theDate

cmd.Parameters.Append dateParam

Dim results As ADODB.Recordset
Set results = cmd.Execute
...