2012-01-31 14 views
0

ユーザが最初にその行がtrashテーブルにコピーされ、inboxDataGridViewから行を削除したい場合私は2つのテーブルこれは正確なクエリですか?

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

を有します。行を最初にコピーするこのクエリを試しています:

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という2つの別々のコマンドとして実行します。 @idパラメータは、コマンドパラメータとしてprevent SQL injection attacksの順に指定する必要があります。

データベース側でソリューションの一部を使用する場合は、ストアドプロシージャとして作成するか、as @ThitLwinOo suggestsトリガーを作成することができます。トリガーアプローチを使用している場合、Deleteステートメントはプログラムから実行するのに十分です。

+0

ありがとうございます – buddy

0

実際には、あなたが望むものを完了させるための簡単で良い方法は、選挙のトリガーを書くことです。 UR DBとは何ですか? SQLサーバー?

あなたのDBはSql Serverであると仮定します.URL内で次のトリガーを試してみてください。


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 

関連する問題