2012-01-31 132 views
0

我有两个表这是一个确切的查询吗?

Inbox(id,accountid,emailfrom,emailsubject,emailbody,emaildate,attachment) 
Trash(as above) 

当用户希望从inboxDataGridView删除一行,首先该行被复制到trash表。我想这个查询先复制该行:

string query = "INSERT INTO Trash(inboxid, accountid, emailfrom, subject, emailbody,emaildate,attachment) SELECT inboxid, accountid, emailfrom, subject, emailbody,emaildate,attachment FROM Inbox WHERE(inboxid = " + accountinfo.PEmailId + ")";(where accountinfo.PEmailId = selectedRow value 

但此查询给我一个错误。

请指导我如何做到这一点,复制和删除。

回答

1

这应该工作:

插入:

INSERT INTO Trash(id, accountid, emailfrom, subject, emailbody, 
    emaildate,attachment) 
SELECT id, accountid, emailfrom, subject, emailbody,emaildate,attachment 
FROM Inbox 
WHERE id = @id 

删除:

DELETE Inbox 
WHERE id = @id 

您需要执行语句in the same command或作为两个单独的命令within a transaction,这取决于您是否想执行其他操作。 @id参数应作为命令参数提供以便prevent SQL injection attacks

如果你想在数据库端的解决方案的一部分,你可以创建一个存储过程或as @ThitLwinOo suggests创建一个触发器。如果您使用触发器方式,Delete语句就足以从您的程序中执行。

+0

感谢它的工作 – buddy 2012-01-31 09:59:29

0

实际上,有一种简单和更好的方式来完成你想要的是通过在选择时写入触发器。你的DB是什么? SQL Server?

我假设你的数据库是Sql Server。请在ur数据库中尝试下面的触发器。


CREATE TRIGGER [dbo].[tri_BACKUP_DELETED_ROWS] 

ON [dbo].[Inbox] 

AFTER DELETE 

AS 

BEGIN 

    SET NOCOUNT ON; 

    -- Insert statements for trigger here 
    IF EXISTS (SELECT * FROM deleted) 
    BEGIN 
     -- keep old record 
     INSERT INTO Trash(inboxid, accountid, emailfrom, subject, emailbody,emaildate,attachment)  
     SELECT inboxid, accountid, emailfrom, subject, emailbody,emaildate,attachment 
     FROM DELETED 
    END 

END