Как определить код ошибки из sp_send_dbmail в SQL Server 2005? - PullRequest
1 голос
/ 23 июня 2011

Я пытаюсь отправить вложение, используя sp_send_dbmail в SQL Server 2005. Сначала я написал хранимую процедуру CLR, которая сохраняет некоторое содержимое в файл на сервере, затем вызывает хранимую процедуру, указанную ниже, а затем удаляет файлсоздано.Я вызываю эту хранимую процедуру CLR из моего приложения ASP.NET 2010.Локально эта функция работает как из SQL Management Studio, так и из моего приложения.

Вот основные вещи из моего CLR sproc:

public static void SendExportAttachment(string email, string fileContents, string mailProfile, string temporaryFileName)
{
    // First save the file to the file system
    StreamWriter sw = new StreamWriter(temporaryFileName);
    sw.Write(fileContents);
    sw.Close();
    sw = null;

    // Execute the SendExportResultEmail (see below)
    using (SqlConnection connection = new SqlConnection("context connection=true"))
    {
        connection.Open();
        SqlCommand command = new SqlCommand("SendExportResultEmail", connection);
        command.CommandType = System.Data.CommandType.StoredProcedure;
        command.Parameters.Add(new SqlParameter("@ProfileName", mailProfile));
        command.Parameters.Add(new SqlParameter("@Recipients", email));
        command.Parameters.Add(new SqlParameter("@TemporaryFileName", temporaryFileName));
        command.ExecuteNonQuery();
    }

    // Remove the file from the file system
    File.Delete(temporaryFileName);
}

Вот хранимая процедура, которая отправляет электронное письмо:

CREATE PROCEDURE [dbo].[SendExportResultEmail]
     @ProfileName NVARCHAR(50)
    ,@Recipients NVARCHAR(100)
    ,@TemporaryFileName NVARCHAR(2000)
AS

SET NOCOUNT ON

DECLARE @ErrorID INT
DECLARE @RtnCode INT
DECLARE @Body VARCHAR(8000)
DECLARE @Subject VARCHAR(1000)
DECLARE @mailitem_id INT

SET @Body = 'Some Body'
SET @Subject = 'Some title'

EXEC @RtnCode = msdb.dbo.sp_send_dbmail
     @profile_name = @ProfileName
    ,@recipients   = @Recipients
    ,@body         = @Body
    ,@subject      = @Subject
    ,@body_format = 'TEXT'
    ,@file_attachments = @TemporaryFileName
    ,@mailitem_id = @mailitem_id OUTPUT

SET @ErrorID = @@ERROR

IF @RtnCode <> 0 BEGIN
    SELECT @ErrorID
END

После успешного тестирования этого кода как части моего приложения локально я переместил его на наш тестовый сервер.На тестовом сервере он успешно отправляет почту, когда я выполняю sproc CLR из Management Studio.Однако, когда я выполняю его из своего приложения ASP.NET, мой код возврата из msdb.dbo.sp_send_dbmail равен 1, а @@ ERROR равен 0 - я не получаю никаких других ошибок.Я знаю, что в SQL 2008 я, вероятно, получу более полезный код @@ ERROR, по крайней мере, в соответствии с документацией 2008 года.

У кого-нибудь есть предложения?Как вы думаете, что я могу делать не так?

Большое спасибо заранее, Джим

1 Ответ

0 голосов
/ 24 июня 2011

, так как вы запускаете msdb.dbo.sp_send_dbmail, который поймает любую ошибку, связанную с электронной почтой, вся информация об ошибке поступает через возвращаемое значение: @RtnCode.Только неправильный вызов msdb.dbo.sp_send_dbmail приведет к любому значению @@ ERROR.Почему бы не перейти к BEGIN TRY - BEGIN CATCH, используемому в SQL Server 2005 +?

  • , когда я запускаю ваш код с плохим @ProfileName (моя первая мысль), я получаю @RtnCode= 4

  • когда я запускаю ваш код с неверным @TeilitaryFileName, я получаю @ RtnCode = 1, о чем вы сообщаете.Вы проверили, что путь и имя файла действительны и доступны из SQL Server ?

...