这是一个确切的查询吗

本文关键字:查询 一个 | 更新日期: 2023-09-27 18:22:10

我有两个表

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

但是这个查询给了我一个错误。

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

这是一个确切的查询吗

这应该有效:

插入:

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

您需要在同一个命令中执行语句,或者在事务中作为两个单独的命令执行语句,这取决于您是否希望在其间执行其他操作。@id参数应作为命令参数提供,以防止SQL注入攻击。

如果您希望解决方案的一部分在数据库端,您可以将其创建为存储过程,也可以按照@ThitWinOo的建议创建触发器。如果您使用触发器方法,Delete语句就足以从程序中执行。

实际上,有一种简单而更好的方法可以完成您想要的任务,那就是在删除时编写触发器。你的数据库是什么?SQL Server?

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


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