sp send dbmail-如何从SQL Server 2005中的sp_send_dbmail中确定错误代码



我正尝试在SQL Server 2005中使用sp_send_dbmail发送附件。我首先编写了一个CLR存储过程,将一些内容保存到服务器上的文件中,然后调用下面列出的存储过程,然后删除它创建的文件。我从ASP.NET 2010应用程序调用此CLR存储过程。在本地,此功能可以从SQL Management Studio和我的应用程序中运行。

以下是我的CLR存储过程中的基本内容:

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

在成功地将此代码作为应用程序的一部分在本地进行测试后,我将其移到了我们的测试服务器上。在测试服务器上,当我从Management Studio执行CLR存储过程时,它会成功发送邮件。但是,当我从ASP.NET应用程序执行它时,msdb.dbo.sp_send_dbmail的返回代码为1,@@ERROR为0-我没有其他错误。我知道在SQL 2008中,我可能会得到一个更有用的@@ERROR代码,至少根据2008文档。

有人有什么建议吗?你认为我可能做错了什么?

非常感谢,Jim

由于您正在运行msdb.dbo.sp_send_dbmail,它将捕获与电子邮件相关的任何错误,所有错误信息都来自返回值@RtnCode。只有对msdb.dbo.sp_send_dbmail格式错误的调用才会导致任何@@ERROR值。为什么不转移到SQLServer2005+中使用的BEGIN TRY-BEGIN CATCH

  • 当我用一个糟糕的@ProfileName运行你的代码时(我的第一个想法),我得到@RtnCode=4

  • 当我使用糟糕的@TemporaryFileName运行您的代码时,我得到@RtnCode=1,这就是您所报告的。您是否已检查文件路径和名称是否有效,是否可以从SQL Server访问?

相关内容

  • 没有找到相关文章

最新更新