2013-06-04 3 views
1

У меня есть таблица с данными пользователяВставить запись в таблицу транзакций для каждого изменения значения столбца таблицы моего пользователя в SQL

User_Name 
User_Address 
User_Gender 

и так далее ..

Теперь моя таблица транзакций содержит поле, как:

Trans_Id 
Trans_User_Field 
Trans_Previuos_Data 
Trans_Add_Date 

Теперь в моем приложении ASP.net, когда пользователь обновить свой адрес или имя или любое другое поле на странице, я должен сравнить это с пОЛЬЗОВАТЕЛЬ таблицы и вставить запись для каждого обновленного поля/столбца в таблица транзакций с предыдущими данными.

Здесь Trans_User_field дает какое поле обновляется (User_Name, User_Address, User_Gender)

Пожалуйста, скажите мне, что это лучший способ сделать это. Сделайте это со стороны SQL или приложения.

БЛАГОДАРЯ

+0

Не могли бы вы просто взять текущее значение из таблицы пользователя, создать новую запись в таблице транзакций, поместить значение в изменение, дату и поле, которое пользователь изменил? Наверное, я не понимаю, с чем вы столкнулись. – mason

+0

У меня есть 200 полей на моей странице, я не знаю, как определить, какой пользователь поля изменился. – user1882705

+0

Как вы представляете свои данные пользователю? Это GridView? – mason

ответ

0

Предполагая, что вы используете веб-форм ASP.NET.

В вашей .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. 
} 

}

Вы, вероятно, хотите, чтобы объединить все это с помощью коллекции (List) и строго типизированные объекты, когда у вас есть концепция вниз. Это уменьшит количество вызовов в базе данных и упростит ваш код.

--Edit-- Если вы хотите сохранить всю историю одного обновления с использованием одной записи в таблице Transcation, вам необходимо изменить таблицу транзакций для поддержки всех полей одновременно. Обратите внимание, что это может быть не так эффективно, в зависимости от того, ожидаете ли вы, что пользователи будут обновлять многие поля за транзакцию или только один.

Trans_Id 
User_Name 
User_Gender 
User_Address 
Trans_Add_Date 
+0

В этом коде C#, как бы я разделил каждое поле, чтобы знать, что это поле обновлено в таблице транзакций. Поскольку я вставляю только одно поле/столбец в таблицу транзакций – user1882705

+0

Обновить таблицу транзакций с несколькими записями, по одному для каждого обновленного поля. – mason

+0

Я не хочу вставлять несколько записей для одного зарегистрированного обновления на странице пользователя. – user1882705

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, дает вам некоторую реальную гибкость. Вы могли бы легко определить, если набор , установленный в столбцах, был изменен путем добавления их битовых значений вместе и просто для этого. Так что давайте говорить, что я хотел бы знать, если адрес и пол были оба изменились -для какой-либо причине -I мог это сделать:

IF (@update_mask & 6 = 6) -- both the second the third fields were modified 
+0

Я думаю, что это не будет работать в моей ситуации ... У меня на столе около 200 столбцов ... – user1882705

1

Как о попытке альтернативный подход. Создайте в таблице Trans_User все поля в таблице User и Trans_Date. Затем создайте триггеры insert/update/delete в таблице User, чтобы заполнить таблицу Trans_User предыдущими данными. Взгляните на это question или this Код проекта.

Смежные вопросы