1

我有一个包含数据的用户表

User_Name
User_Address
User_Gender 

等等..

现在我的交易表包含如下字段:

Trans_Id
Trans_User_Field
Trans_Previuos_Data
Trans_Add_Date

现在,在我的 ASP.net 应用程序中,当用户更新他们的地址或姓名或页面上的任何其他字段时,我必须将其与 USer 表进行比较,并将每个更新的字段/列的记录插入到带有先前数据的事务表中。

这里 Trans_User_field 为您提供更新的字段(User_Name,User_Address,User_Gender)

请告诉我最好的方法是什么。在 SQL 端或应用程序端执行此操作。

谢谢

4

3 回答 3

1

虽然我可能会对此感到厌烦,因为人们非常讨厌触发器,但我会在这里推荐一个。你可以像这样构建一个:

CREATE TRIGGER update_user ON table FOR UPDATE
AS

DECLARE @update_mask AS INT
SELECT @update_mask = COLUMNS_UPDATED()

IF ( @update_mask & 1 = 1 ) -- this means the first column was modified
IF ( @update_mask & 2 = 2 ) -- this means the second column was modified
IF ( @update_mask & 4 = 4 ) -- this means the third column was modified
IF ( @update_mask & 8 = 8 ) -- this means the fourth column was modified

我想你明白了。从那里您可以从updated行中获取更新的值并INSERT放入您的另一个表中。看,使用该COLUMNS_UPDATED方法给了你一些真正的灵活性。您可以通过将一组列的位值相加并查找它来轻松确定是否修改了一组列。所以假设我想知道地址和性别是否都改变了——无论出于何种原因——我可以这样做:

IF ( @update_mask & 6 = 6 ) -- both the second the third fields were modified
于 2013-06-04T20:13:27.017 回答
1

试试另一种方法怎么样。创建一个 Trans_User 表将 User 表和 Trans_Date 中的所有字段。然后在 User 表上创建插入/更新/删除触发器,以使用以前的数据填充 Trans_User 表。看看这个问题这个代码项目文章。

于 2013-06-04T20:14:23.910 回答
0

假设您使用的是 ASP.NET Web 窗体。

在您的 .aspx 页面中

 TextBox1: <asp:TextBox runat="server" id="TextBox1" /><br />
 TextBox2: <asp:TextBox runat="server" id="TextBox2" /><br />
 <asp:Button runat="server" id="Button1" OnClick="Button1_Click" Text="Submit" />

在您的 .aspx.cs 页面中

 protected void Button1_Click(object sender, EventArgs e)
 {
      string original_text=GetOriginalTextOfTextBox1();
      if(TextBox1.Text==original_text)
      {
           //the text didn't change
      }
      else
      {
           //the text changed. need to update the transaction table and the user table.
      }
      string originaltext2=GetOriginalTextOfTextBox2();
      if(TextBox2.Text==originaltext2)
      {
           //the text didn't change
      }
      else
      {
           //the text changed. need to update the transaction table and the user table.
      }

 }
 protected string GetOriginalTextOfTextBox1()
 {
     //code here that gets the original value of TextBox1 from the User table.
 }
 protected string GetOriginalTextOfTextBox2()
 {
      //code here that gets the original value of TextBox2 from the User table.
 }

}

一旦您掌握了概念,您可能希望使用集合(列表)和强类型对象来组合所有这些。这将最大限度地减少对数据库的调用次数并简化您的代码。

--Edit-- 如果您想在Transcation 表中使用单个记录存储单个更新的所有历史记录,您需要修改Transaction 表以一次支持所有字段。请注意,这可能不那么节省空间,具体取决于您是希望用户在每个事务中更新多个字段还是只更新一个字段。

 Trans_Id
 User_Name
 User_Gender
 User_Address
 Trans_Add_Date
于 2013-06-04T20:10:26.073 回答