我正尝试在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访问?