我有一个gridview,它显示表中的记录集 - Master2。我想使用gridview删除此表中的记录。在删除发生之前,我想将记录插入到历史表中,其中包含来自执行删除操作的人的datetimestamp和userid。这是可能的还是我应该用一系列下拉框和一个按钮构建字段?
答案 0 :(得分:1)
使用
FOR DELETE
触发器:
CREATE TRIGGER TriggerName
ON TableName
FOR DELETE
AS
BEGIN
INSERT INTO HistoryTable(Col1, Col2, Col3)
SELECT Col1, GETDATE(), Col3
FROM TableName
WHERE DeletedRecordID IN (SELECT DeletedRecordID FROM TableName)
END
答案 1 :(得分:0)
使用触发器。
更安全,这意味着每次从该历史记录表中删除记录时(无论机制如何),它仍然会触发。
代码也更容易,因为您不必在.net代码中放置任何内容来处理它。
最后,由于涉及的网络流量为零,因此速度更快。
答案 2 :(得分:0)
我建议使用标记进行删除,而不是实际删除记录... 在gridview中,你添加了一个额外的检查点,当它被选中时它会触发......就像这样
<asp:TemplateField HeaderText="Delete" SortExpression="ToBeDeleted">
<EditItemTemplate>
<asp:TextBox ID="txtToBeDeleted" runat="server" Text='<%# Bind("ToBeDeleted") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<%--<asp:Label ID="lblToBeDeleted" Width="20px" runat="server" Text='<%# Bind("ToBeDeleted") %>'></asp:Label>--%>
<asp:CheckBox ID="chkToBeDeleted" Width="20px" runat="server" Checked='<%# Bind("ToBeDeleted") %>' OnCheckedChanged="chkToBeDeleted_CheckedChanged" AutoPostBack="true"/>
</ItemTemplate>
<ItemStyle CssClass="overflowClass" HorizontalAlign="Center" Wrap="false" />
</asp:TemplateField>
然后在后面的代码中处理触发器:
protected void chkToBeDeleted_CheckedChanged(object sender, EventArgs e)
{
CheckBox cb = (CheckBox)sender;
GridViewRow gvr = (GridViewRow)cb.NamingContainer;
int id = (int)gvWines.DataKeys[gvr.RowIndex].Value;
ListOfWine record = (from l in db.ListOfWines
where l.Id == id
select l).FirstOrDefault();
//here you add the record to another table and then continue flagging the record for deletion
record.ToBeDeleted = cb.Checked;
db.SaveChanges();
gvWines.DataBind();
}