2013-05-16 178 views
0

每當我向我的數據庫中插入記錄時,記錄都會被添加3次。多次插入相同的記錄

try 
{ 
    con.Open(); 

    object addedkey = cmd.ExecuteScalar(); 

    if ((addedkey != null && (addedkey != DBNull.Value))) 
    { 
     addedkey = Convert.ToInt32(cmd.ExecuteScalar()); 
    } 

    added = cmd.ExecuteNonQuery(); 

    lblResult.Text = added.ToString() + " record opgeslagen."; 
    lblResult.Text = addedkey.ToString(); 
} 

但是當我註釋掉ExecuteScalarExecuteNonQuery一切工作正常。因此,如果我將其中的一個註釋掉,該記錄將插入兩次。

這開始發生在我添加了一個刪除按鈕後,與insert命令無關。

有誰知道這是什麼原因造成的?

在此先感謝。 :)

+5

它看起來像你執行命令3倍。 – criticalfix

+0

你可以發佈你的cmd.executenonquery方法,從你的代碼我有一個印象,你正在覆蓋這些功能,根據自定義需求。 – Alok

回答

4

每次運行'Execute ...()'方法時,您正在執行插入命令。您在代碼中運行三次,因此插入3次記錄。

object addedkey = cmd.ExecuteScalar(); //you run the insert command here 
    if ((addedkey != null && (addedkey != DBNull.Value))) 
    { 
     addedkey = Convert.ToInt32(cmd.ExecuteScalar());//you run the insert command here 
    } 
    added = cmd.ExecuteNonQuery();//you run the insert command here 
    lblResult.Text = added.ToString() + " record opgeslagen."; 
    lblResult.Text = addedkey.ToString(); 
+0

在將某個刪除命令的代碼添加到別處之前,我沒有遇到這個問題。 –

+0

您可以發佈您使用的查詢嗎? – jle

+0

string insertSQL;插入SQL =「INSERT INTO Deelnemer(」; insertSQL + =「Naam,Tussenvoegsel,Achternaam)」;插入SQL + =「VALUES(」; insertSQL + =「@Naam,@Tussenvoegsel,@Achternaam); SELECT scope_identity();」; –

0

您正在執行3次。所以真的,你需要在第一次執行後重構代碼。

您可以更改

addedkey = Convert.ToInt32(cmd.ExecuteScalar()); 

到這一點 - 這將阻止第二次執行:

addedkey = Convert.ToInt32(addedKey); 

並改變這一點:

added = cmd.ExecuteNonQuery(); 

到這一點 - 這將防止第三執行(假定added是一個int,並且是你執行的返回。)

added = addedKey; 

如果added實際上是boolean然後將其設置你的if裏面,因爲它會被你if聲明證實

IE

{ 
    addedkey = Convert.ToInt32(addedKey);//you run the insert command here 
    added = true; 
} 
+0

我的老師告訴我使用executablecalar來獲取剛剛添加的記錄的標識,並執行查詢以顯示受影響的行,然後我必須在標籤上顯示。所以'added'是受影響的行,'addedkey'是剛剛創建的記錄的標識。 –

+0

然後你需要改變你的選擇語句。這需要返回一個ID,所以假設您的返回值val被稱爲'@ id',則將「SELECT @id = SCOPE_IDENTITY()'」添加到您的SQL語句中。 – Darren