什么是监控ASP.Net表单上数据更改的最有效方法?

时间:2012-01-16 17:25:09

标签: c# asp.net

我有一个ASP.Net表单,我想在用户更改数据时发送电子邮件。该电子邮件应仅包含已更改的数据,并且总共有大约15个数据字段。

我不想使用ORM,因为我正在更新第三方为我们构建的网站,并且所有数据访问调用都通过他们的自定义库。

我能想到的唯一方法就是

  • 进行另一次数据库调用以获取旧值并逐个比较表单值。如果它们不同,请附加到电子邮件中。

  • 将原始数据存储在首次加载时(隐藏字段,会话等),并再次比较一个字段的数据并将差异附加到电子邮件

  • 请有人告诉我,我没有想到更容易和/或更简单的方法

3 个答案:

答案 0 :(得分:2)

所有文本框都会有TextChanged个事件,您可以将它们标记为已修改。 ComboBox将有一个SelectedIndexChanged事件,依此类推。

编辑:所有已更改的事件都可以检查其初始值(即使在还原的更改中),并将其自身标记为仍未修改或在还原时标记为未修改。

答案 1 :(得分:0)

以下是一些可能/可能没用的建议:

  • 触发数据库表,触发器比较旧(使用DELETED表)并更新(使用INSERTED表),然后发送电子邮件。这可能是也可能不可行,我不是触发器的主要倡导者。
  • 就像你已经说过你可以进行另一个数据库调用,这是我推荐的方法。

答案 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");