2012-03-07 43 views
1

我有以下查詢:INSERT對UPDATE

SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["chestionar"].ConnectionString); 
SqlCommand cmd = new SqlCommand("INSERT INTO Raspunsuri Values(@raspuns,@cnp,@data,'1',@ip,@idsesiune)", con); 

cmd.Parameters.AddWithValue("@cnp", Session["sesiune_cnp"]); 
cmd.Parameters.AddWithValue("@raspuns", textbox1.Text); 
cmd.Parameters.AddWithValue("@data", DateTime.Now.ToLocalTime()); 
cmd.Parameters.AddWithValue("@ip",ip); 
cmd.Parameters.AddWithValue("@idsesiune", id_sesiune); 

try 
{ 
    con.Open(); 
    cmd.ExecuteNonQuery(); 
    Response.Redirect("User2.aspx"); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine("Error:" + ex); 
} 
finally 
{ 
    con.Close(); 
} 

我需要的是看是否有表中的任何記錄,如果沒有比別人更新插入it.How我能做到這一點?

+2

什麼定義了一個紀錄表中已經存在?什麼是獨特的數據?本質上,你只需要首先做一個SELECT(或COUNT)查詢來查找數據,如果它在那裏,你可以做一個UPDATE而不是一個INSERT – musefan 2012-03-07 10:31:04

回答

2

您可以使用SQL EXISTS的功能,例如

SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["chestionar"].ConnectionString); 
    SqlCommand cmd = new SqlCommand("if Exists(Select 1 from Raspunsuri where <your unique criteria>)\r\n" + 
"Update Raspunsuri set <values you want to set> where <your unique criteria\r\n" + 
"else\r\n" + 
"INSERT INTO Raspunsuri Values(@raspuns,@cnp,@data,'1',@ip,@idsesiune)", con); 

    cmd.Parameters.AddWithValue("@cnp", Session["sesiune_cnp"]); 
    cmd.Parameters.AddWithValue("@raspuns", textbox1.Text); 
    cmd.Parameters.AddWithValue("@data", DateTime.Now.ToLocalTime()); 
    cmd.Parameters.AddWithValue("@ip",ip); 
    cmd.Parameters.AddWithValue("@idsesiune", id_sesiune); 

這應該做的技巧

+0

對不起,我離開PC並沒有看到Curt已經發布了與我所建議的相同的答案。 – Jaques 2012-03-07 10:47:20

+0

它沒有做任何事情.. – Rares 2012-03-07 12:48:16

6

這可能是最好在存儲過程中完成的,因爲涉及的腳本數量很多(這將是內聯混亂!)。

傳遞參數到一個存儲過程,做這樣的事情:

IF EXISTS(SELECT cnp FROM Raspunsuri WHERE [email protected]) 
BEGIN 
    UPDATE ... 
    WHERE [email protected] 
END 
ELSE 
BEGIN 
    INSERT INTO.... 
END 

假設@cnp是你的主鍵


你的SqlCommand將被更改爲:

SqlCommand cmd = new SqlCommand("sp_StoredProcedureName", con); 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Parameters.AddWithValue("@cnp", Session["sesiune_cnp"]); 
cmd.Parameters.AddWithValue("@raspuns", textbox1.Text); 
cmd.Parameters.AddWithValue("@data", DateTime.Now.ToLocalTime()); 
cmd.Parameters.AddWithValue("@ip",ip); 
cmd.Parameters.AddWithValue("@idsesiune", id_sesiune); 
+0

我完全同意。投票 – AngeloBad 2012-03-07 10:59:32

+0

-1。如:我的ORM自動生成Upserts,當它告訴它並且它不使用存儲過程時。「只是這樣做」;) – TomTom 2012-03-07 18:08:03

2

您可以使用SQL Server的@@ROWCOUNT功能。

UPDATE Raspunsuri SET (...) WHERE PrimaryKeyColumn='YourValue' 
IF @@ROWCOUNT=0 
    INSERT INTO Raspunsuri VALUES (...) 

類似的問題:Insert/Update to Sql

0

首先,通過將查詢寫爲「從表名中選擇count(*)where columnvalue =」something「來檢查表中是否存在該記錄。如果count大於0,則表中有記錄。因此,在這種情況下你寫的更新語句別人寫INSERT語句。這個你可以在你的代碼或通過編寫存儲過程編寫。

0

我需要的是看錶中是否有任何記錄,如果 比更新還要插入它,我該如何實現?

我喜歡@亞歷克斯的做法

-- For each row in source 
BEGIN TRAN 

UPDATE target 
SET <target_columns> = <source_values> 
WHERE <target_expression> 

IF (@@ROWCOUNT = 0) 
INSERT target (<target_columns>) 
VALUES (<source_values>) 

COMMIT