2015-02-02 3 views
0

Я пытаюсь запустить следующее:Выполнение msdb.dbo.sp_send_dbmail через ADO изнутри VBA в Excel

Sub sendMailViaADO() 

Dim cmdStoredFunct As ADODB.Command 
Dim r As ADODB.Recordset 

Dim strConn As String 
strConn = _ 
    "PROVIDER=SQLOLEDB.1;" & _ 
    "P-----D=xxxxx;" & _ 
    "PERSIST SECURITY INFO=True;" & _ 
    "USER ID=yyyyyy;" & _ 
    "INITIAL CATALOG=xxxxx;" & _ 
    "DATA SOURCE=xxxxx;" & _ 
    "USE PROCEDURE FOR PREPARE=1;" & _ 
    "AUTO TRANSLATE=True;" & _ 
    "CONNECT TIMEOUT=0;" & _ 
    "COMMAND TIMEMOUT=0" & _ 
    "PACKET SIZE=4096;" & _ 
    "USE ENCRYPTION FOR DATA=False;" & _ 
    "TAG WITH COLUMN COLLATION WHEN POSSIBLE=False" 

Set c= New ADODB.Connection 
c.ConnectionString = strConn 
c.CommandTimeout = 0 
c.Open 

Set cmdStoredFunct = New ADODB.Command 
Set cmdStoredFunct.ActiveConnection = c 
Set r = New ADODB.Recordset 

With cmdStoredFunct 
    .CommandText = "msdb..sp_send_dbmail" 
    .CommandText = adCmdStoredProc 

    .Parameters.Append .CreateParameter("@recipients", adVarWChar, adParamInput, 50, "[email protected];") 
    .Parameters.Append .CreateParameter("@subject", adVarWChar, adParamInput, 50, "xxx") 
    .Parameters.Append .CreateParameter("@body", adVarWChar, adParamInput, 50, "yyy") 

    Set r = .Execute 
End With 

'>>> 
'>>>is there another way like the following ? 
'Dim sTemp1 
'sTemp1 = "{call msdb.dbo.sp_send_dbmail('[email protected]', 'xxx', 'yyy')}" 
'>>> 


If Not (cmdStoredFunct Is Nothing) Then 
    Set cmdStoredFunct.ActiveConnection = Nothing 
    Set cmdStoredFunct = Nothing 
End If 
If Not (c Is Nothing) Then 
    If (c.State And 1) = 1 Then c.Close 
End If 


End Sub 

Он erroring по команде выполнить Set r = .Execute с этим сообщением:

enter image description here

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

Как исправить это?

+0

Не уверен, что это проблема, но похоже, что у вас отсутствует dbo в 'msdb..sp_send_dbmail', который будет' msdb.dbo.sp_send_dbmail' –

+0

Есть ли причина, по которой вы отправляете письма через SQL Server ? Считаете ли вы использование инструмента командной строки, такого как «BLAT», или используя любое количество библиотек SMTP VBA для этого? Тогда не задействован SQL Server. Например, вы можете сделать выше в «BLAT» в одной строке в пакетном файле без необходимости подключения к базе данных –

+0

@ Nick.McDermaid благодарит за информацию - у нас установлен SQL-сервер, поэтому мне не нужно устанавливать какие-либо третьи инструмент партии. Я думаю, что я очень близко в коде, который я опубликовал в вопросе, - можете ли вы помочь ему ответить? – whytheq

ответ

1

В качестве примера, если вы хотите, чтобы избежать использования объекта команды:

Dim sSQL as String 

sSQL = 
    "EXEC msdb.dbo.sp_send_dbmail " & _ 
     @recipients='[email protected]'," & _ 
     @subject='xxx'," & _ 
     @body='yyy'" 

Call r.Open(sSQL,c) 

Люди Хафф и слоеного о инъекции SQL, но тот наименьший из ваших забот.

+0

ok - Я подниму этот ответ и опрокину вас на край 5k! – whytheq

+0

Я посмотрю, если это сработает, а затем, если это произойдет, я смогу вернуться к исходному вопросу и попытаться объяснить это. – whytheq

+0

Любая удача @whytheq? –