我正在将数据从数据库导出到XML文件。这个效果很好。根据数据量的不同,XML文件只包含一个或数百个数据集。此过程每天都会触发。现在,数据集应该有一个类似“fileno”的属性,它在开始时应该是零,然后总是增加值1。现在我看到了foreach容器和ssis中的容器。不幸的是,我担心使用这样一个容器会让所有的数据集每天都有相同的“fileno”,因此它们并不是都正确地被提出。此外,我不知道在ssis中是否可以将变量“fileno”的最后一个值缓存在某个地方,以便在第二天使用下一个更高的值“fileno”,而不是从零开始…
你知道如何计算这样一个变量并将其存储在某个地方,以便在第二天再次调用它吗?最后应该是这样的:
谢谢你的帮助。
最佳答案
可以使用c脚本任务来检索最后的FileNo
值。完成此操作后,可以更新ssis变量以保存此值,您可以通过将其记录到表或其他方法来存储它。另一个选项是直接存储在脚本任务的表中。这两个选项概述如下。在脚本中,DateTime.Now
属性也存储为时间戳。下面的示例包括使用LINQ的FileNo
方法从xml元素和属性获取最后的LastOrDefault
。如果找不到元素,此方法将返回默认值,而在这种情况下,Last
方法将抛出错误。使用的xml路径当然是一个示例,需要更改为您的路径。
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Xml.Linq;
string xmlFile = Dts.Variables["User::XMLFilePath"].Value.ToString();
//load xml document
XDocument xmlDoc = XDocument.Load(xmlFile);
//get last FileNo value
string lastFileNoElement = xmlDoc.Elements("Root").Elements("Element1").
Elements("Element2").Elements("FileNo").LastOrDefault().Value.ToString();
string lastFileNoAttribute = xmlDoc.Elements("Root").Elements("Element1")
.Elements("Element2").Attributes("FileNo").LastOrDefault().Value.ToString();
//update ssis variable (element)
Dts.Variables["User::FileNoElement"].Value = lastFileNoElement;
//update ssis variable (attribute)
Dts.Variables["User::FileNoAttribute"].Value = lastFileNoAttribute;
//create connection
string connStr = @"Data Source=YourServer;Initial Catalog=Database;Integrated Security=true";
string cmd = "INSERT INTO Schema.LoggingTable (FileNoAttribute, FileNoElement, ExecutionTime) values(@atName, @eleName, @execTime)";
using (SqlConnection conn = new SqlConnection(connStr))
{
SqlCommand sql = new SqlCommand(cmd, conn);
//attribute parameter
SqlParameter aParam = new SqlParameter("@atName", SqlDbType.VarChar);
aParam.Size = 50;
aParam.Direction = ParameterDirection.Input;
aParam.Value = lastFileNoAttribute;
//element parameter
SqlParameter eParam = new SqlParameter("@eleName", SqlDbType.VarChar);
eParam.Size = 50;
eParam.Direction = ParameterDirection.Input;
eParam.Value = lastFileNoElement;
//timestamp
SqlParameter dateParam = new SqlParameter("@execTime", SqlDbType.DateTime);
dateParam.Direction = ParameterDirection.Input;
dateParam.Value = DateTime.Now;
sql.Parameters.Add(aParam);
sql.Parameters.Add(eParam);
sql.Parameters.Add(dateParam);
conn.Open();
//insert data
sql.ExecuteNonQuery();
}