我有一个ASP.Net表单,我想在用户更改数据时发送电子邮件。该电子邮件应仅包含已更改的数据,并且总共有大约15个数据字段。
我不想使用ORM,因为我正在更新第三方为我们构建的网站,并且所有数据访问调用都通过他们的自定义库。
我能想到的唯一方法就是
进行另一次数据库调用以获取旧值并逐个比较表单值。如果它们不同,请附加到电子邮件中。
将原始数据存储在首次加载时(隐藏字段,会话等),并再次比较一个字段的数据并将差异附加到电子邮件
请有人告诉我,我没有想到更容易和/或更简单的方法
答案 0 :(得分:2)
所有文本框都会有TextChanged
个事件,您可以将它们标记为已修改。 ComboBox将有一个SelectedIndexChanged
事件,依此类推。
编辑:所有已更改的事件都可以检查其初始值(即使在还原的更改中),并将其自身标记为仍未修改或在还原时标记为未修改。
答案 1 :(得分:0)
以下是一些可能/可能没用的建议:
答案 2 :(得分:0)
根据您所说的,我认为唯一的方法是在表单上创建一个重复的数据集来存储旧数据,并在您要生成电子邮件的位置运行比较。
您可以使用Dataset.Copy
复制结构和数据。
但是,现在我考虑过它总是有Datset.GetChanges()
方法和Dataset.AcceptChanges()
以及DataSet.HasChanges()
此link的示例代码:
if(dataSet.HasChanges(DataRowState.Modified |
DataRowState.Added)&& dataSet.HasErrors)
{
// Use GetChanges to extract subset.
changesDataSet = dataSet.GetChanges(
DataRowState.Modified|DataRowState.Added);
PrintValues(changesDataSet, "Subset values");
// Insert code to reconcile errors. In this case, reject changes.
foreach(DataTable changesTable in changesDataSet.Tables)
{
if (changesTable.HasErrors)
{
foreach(DataRow changesRow in changesTable.Rows)
{
//Console.WriteLine(changesRow["Item"]);
if((int)changesRow["Item",DataRowVersion.Current ]> 100)
{
changesRow.RejectChanges();
changesRow.ClearErrors();
}
}
}
}
// Add a column to the changesDataSet.
changesDataSet.Tables["Items"].Columns.Add(
new DataColumn("newColumn"));
PrintValues(changesDataSet, "Reconciled subset values");
// Merge changes back to first DataSet.
dataSet.Merge(changesDataSet, false,
System.Data.MissingSchemaAction.Add);
}
PrintValues(dataSet, "Merged Values");