【发布时间】:2022-01-08 05:29:36
【问题描述】:
我正在尝试查询数据库并发送电子邮件正文中的内容。对于我的用例,我尝试关注here。但是当我尝试运行包时,它会抛出死锁错误。谁能建议我错过了什么
脚本如下
namespace ST_ac39a1a4cb6047819cc46d683db46ac6
{
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
}
public void Main()
{
Variables varCollection = null;
string User_Recepient_Email_ID = Dts.Variables["User::UserEml"].Value.ToString();
Dts.VariableDispenser.LockForWrite("User::EmailData");
Dts.VariableDispenser.GetVariables(ref varCollection);
var data = varCollection["User::EmailData"].Value;
OleDbDataAdapter da = new OleDbDataAdapter();
DataTable dt = new DataTable();
da.Fill(dt, varCollection["User::EmailData"].Value);
SendMailMessage("loadJob@xyz.com", User_Recepient_Email_ID, "ETL Load Status Report", ConvertDataTableToHTML(dt), true, "smtp.xxxxxxxx.org");
Dts.TaskResult = (int)ScriptResults.Success;
}
public static string ConvertDataTableToHTML(DataTable dt)
{
string html = "<table border ='1'>";
//add header row
html += "<tr>";
for (int i = 0; i < dt.Columns.Count; i++)
html += "<th>" + dt.Columns[i].ColumnName + "</th>";
html += "</tr>";
//add rows
for (int i = 0; i < dt.Rows.Count; i++)
{
html += "<tr style='color:blue;'>";
for (int j = 0; j < dt.Columns.Count; j++)
html += "<td>" + dt.Rows[i][j].ToString() + "</td>";
html += "</tr>";
}
html += "</table>";
return html;
}
private void SendMailMessage(string From, string SendTo, string Subject, string Body, bool IsBodyHtml, string Server)
{
MailMessage htmlMessage;
SmtpClient mySmtpClient;
htmlMessage = new MailMessage(From, SendTo, Subject, Body);
htmlMessage.IsBodyHtml = IsBodyHtml;
mySmtpClient = new SmtpClient(Server);
mySmtpClient.Credentials = CredentialCache.DefaultNetworkCredentials;
mySmtpClient.Send(htmlMessage);
}
}
}
还有任务脚本属性
运行包时出现错误
错误:脚本任务中的 0xC001405C:尝试锁定变量“User::EmailData”以进行读/写访问时检测到死锁。尝试 16 次后无法获取锁。锁超时。`
错误:脚本任务中的 0xC001405D:尝试锁定变量“System::InteractiveMode”以进行读访问和变量“User::EmailData”进行读/写访问时检测到死锁。尝试 16 次后无法获取锁。锁超时。
错误:脚本任务中的 0x1:尝试锁定变量“User::EmailData”以进行读/写访问时检测到死锁。尝试 16 次后无法获取锁。锁超时。 任务失败:脚本任务
警告:每个用户在 Foreach 循环中出现 0x80019002:SSIS 警告代码 DTS_W_MAXIMUMERRORCOUNTREACHED。 Execution 方法成功,但引发的错误数 (5) 达到了允许的最大值 (1);导致失败。当错误数量达到 MaximumErrorCount 中指定的数量时,就会发生这种情况。更改 MaximumErrorCount 或修复错误。 警告:SurplusMouse_EmailOrderDetail 处的 0x80019002:SSIS 警告代码 DTS_W_MAXIMUMERRORCOUNTREACHED。 Execution 方法成功,但引发的错误数 (5) 达到了允许的最大值 (1);导致失败。当错误数量达到 MaximumErrorCount 中指定的数量时,就会发生这种情况。更改 MaximumErrorCount 或修复错误。 SSIS 包
编辑
下面是查询
SELECT cus.CustomerNumber as CustomerNumber,cus.Location as ReceivingLocation,
i.StrainName as StrainName,i.StrainCode as StrainCode,i.Age as Age,
i.Sex as Sex,i.Genotype as Genotype,i.RoomNumber as SentFrom,io.OrderQuantity as OrderQuantity
FROM [dbo].[MouseOrder] mo
JOIN [dbo].[Customer] cus on cus.Customer_ID = mo.CustomerId
JOIN [dbo].[InventoryOrder] io on io.OrderId = mo.MouseOrder_ID
JOIN [dbo].[Inventory] i on i.Inventory_ID = io.InventoryId
WHERE mo.OrderDate = convert(date,getdate() AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time') and mo.SAMAccountEmail = ?
【问题讨论】:
-
你的底层数据库是SQL Server吗?
-
是的,它是 Azure SQL 数据库
标签: c# sql-server ssis etl