2013-07-19 151 views
0

以前有過類似的問題,但我並不真正瞭解答案。這裏是我的查詢使用SQL插入自動增量

using (SqlCommand cmd = new SqlCommand(
    "INSERT INTO Results VALUES(@ResultID, @HasSucceeded, @ScenarioID, @Screenshot)", 
    conn)) 
{ 
    cmd.Parameters.AddWithValue("@ResultID", Id); 
    cmd.Parameters.AddWithValue("@HasSucceeded", HasSucceeded); 
    cmd.Parameters.AddWithValue("@ScenarioID", Id); 
    cmd.Parameters.AddWithValue("@Screenshot", screenshot); 

    cmd.ExecuteNonQuery(); 
} 

現在我使用Id作爲佔位符爲@ResultID。我真正想要做的是autoincrement@ResultID與此INSERT INTO查詢。我怎樣才能做到這一點?

+6

順便說一句,我懷疑這個代碼將永遠拿過去我,如果我在做一個回顧它。在INSERT語句中指定列名稱,而不僅僅是值。您可以稍後感謝我。 (如果表結構發生任何事情使它與你的代碼假設不相容,你會得到一個異常,而不是將數據插入到意外列中。) –

+6

只需使用IDENTITY列:問題解決了(你不要告訴它要插入的值:它本身就是這樣) –

+0

@MarcGravell雖然我不確定如果稍後需要該值,那麼它可以幫助OP。但是,如果是這樣的話,那就是存儲過程開始被調用的地方。 (無論如何它可能會被調用,但是特別是......) –

回答

3

使此IDENTITY列(例如,IDENTITY(1,1)),並讓數據庫管理它。試圖從外部管理它是一個線程噩夢。然後,它成爲(注意,這是異常複雜,由於使用ID爲2列,這聽起來像一個錯誤):

int newId = 0; 

using (SqlCommand cmd = new SqlCommand(
    @"INSERT INTO Results (HasSucceeded, Screenshot) 
     VALUES (@HasSucceeded, @Screenshot); 
     DECLARE @ResultID int = SCOPE_IDENTITY(); 
     UPDATE Results SET ScenarioID = @ResultID 
        WHERE ResultID = @ResultID; 
     SELECT @ResultID;", conn)) 
{ 
    cmd.Parameters.AddWithValue("@HasSucceeded", HasSucceeded); 
    cmd.Parameters.AddWithValue("@Screenshot", screenshot); 

    newId = (int)cmd.ExecuteScalar(); 
} 

// ...Use newId here... 
+0

雖然我同意這應該是一個身份,如果它不是,並且有其他代碼插入此表(從此應用程序,從其他應用程序或從數據導入),那麼你可能會導致它中斷。 – HLGEM