【问题标题】:How can I determine the error code from sp_send_dbmail in SQL Server 2005?如何确定 SQL Server 2005 中 sp_send_dbmail 的错误代码?
【发布时间】:2011-06-23 19:17:26
【问题描述】:

我正在尝试使用 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 sproc 时,它成功发送了邮件。但是,当我从我的 ASP.NET 应用程序执行它时,我从 msdb.dbo.sp_send_dbmail 的返回码是 1,而 @@ERROR 是 0 - 我没有收到其他错误。我知道在 SQL 2008 中我可能会得到一个更有帮助的@@ERROR 代码,至少根据 2008 年的文档是这样。

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

提前非常感谢,吉姆

【问题讨论】:

  • 您是否在服务器上配置了正确的@ProfileName?
  • 是的。我已经验证过了。如果我没有,它会抛出一个可捕获的错误。

标签: sql-server-2005 sp-send-dbmail


【解决方案1】:

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

  • 当我使用错误的 @ProfileName(我的第一个想法)运行您的代码时,我得到 @RtnCode=4

  • 当我使用错误的 @TemporaryFileName 运行您的代码时,我得到 @RtnCode=1,这就是您报告的内容。您是否检查过文件路径和名称是否有效且可访问 来自 SQL Server

【讨论】:

  • 好的,我已经解决了这个问题。我将包含 sp_send_dbmail 的存储过程的执行移出 CLR sproc,并在执行 CLR sproc 后执行它。当我这样做时,我收到以下错误:无法模拟客户端连接安全上下文。附加文件需要集成的客户端登录。我确定这就是之前引发错误的原因,所以我很确定我可以从这里进行故障排除。谢谢大家,吉姆
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多