2016-02-17 45 views
0

我想顯示最後插入的row.my的預訂ID。我的插入代碼如下。請任何人都可以給我的代碼,以顯示ID我如何得到最後插入的行的ID

protected void Button1_Click(object sender, EventArgs e) 
    { 
     string cs = ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString; 
     using (SqlConnection con = new SqlConnection(cs)) 
     { 
      SqlCommand cmd; 
      SqlDataReader dr; 
      con.Open(); 
      cmd = new SqlCommand("insert into [booking] values('" + TextBox1.Text + "','" + TextBox2.Text + "','" + TextBox3.Text + "','" + TextBox4.Text + "','" + TextBox5.Text + "','" + TextBox6.Text + "','" + TextBox7.Text + "','" + TextBox8.Text + "','" + TextBox9.Text + "','" + TextBox10.Text + "','" + TextBox11.Text + "')", con); 

      cmd.ExecuteNonQuery(); 

     } 
    } 
+1

這並沒有解決您的問題,但yikes - 注意[SQL注入](https://en.wikipedia.org/wiki/SQL_injection)!也許可以考慮一個[參數化查詢](http://www.techrepublic.com/article/shorten-development-time-by-using-parameterized-queries-in-adonet/)。 –

+0

您需要使用參數化查詢,SqlCommand是一次性的,您需要說明您使用的數據庫是否可以負責。 –

+0

可能重複[獲取插入行的身份的最佳方式?](http://stackoverflow.com/questions/42648/best-way-to-get-identity-of-inserted-row) –

回答

0

你會好起來的這樣一個存儲過程,並且不易被注入。


當您當前的代碼實現它,添加一個調用;SELECT SCOPE_IDENTITY()

cmd = new SqlCommand("insert into [booking] values('" + TextBox1.Text + "','" + TextBox2.Text + "','" + TextBox3.Text + "','" + TextBox4.Text + "','" + TextBox5.Text + "','" + TextBox6.Text + "','" + TextBox7.Text + "','" + TextBox8.Text + "','" + TextBox9.Text + "','" + TextBox10.Text + "','" + TextBox11.Text + "');SELECT SCOPE_IDENTITY()", con); 

而且execute as scalar

var id = cmd.ExecuteScalar(); 

(這裏假設你對你的表有標識列)


要做到這一點作爲一個存儲過程:

如果你有值的數量有限,你可以創建存儲過程正常,與@Parameter每個TextBox.TextSELECT SCOPE_IDENTITY()末。

但它看起來像輸入數量可變,所以請參閱How to insert a multiple rows in SQL using stored procedures?,其中概述了使用表參數和使用UDF拆分值列表的方法。

同樣,您需要在proc的末尾輸入SELECT SCOPE_IDENTITY()以獲取最後一行的標識。


有關選擇的方法的詳細討論,最後插入的ID看到What is the difference between Scope_Identity(), Identity(), @@Identity, and Ident_Current?

+0

@JamieR確實 - 因此「但是作爲一個存儲過程你會做得更好,並且不容易注射。」 – NikolaiDante

+0

有關此技術的完整示例:https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar%28v=vs.110%29.aspx –

+0

@SteveWellens謝謝,補充說,在我宣佈它在 – NikolaiDante

1

我會建議使用這樣的事情:

protected void Button1_Click(object sender, EventArgs e) 
{ 
    var cs = ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString; 
    using (var con = new SqlConnection(cs)) 
    { 
     con.Open(); 
     var cmd = new SqlCommand(
      "DECLARE @IDReturnTable TABLE(ID INT); INSERT INTO [booking] OUTPUT INSERTED.NameOfYourIdColumn INTO @IDReturnTable VALUES(@param1, @param2, @param3); SELECT ID FROM @IDReturnTable", 
      con); 
     cmd.Parameters.Add("@param1", SqlDbType.VarChar).Value = TextBox1.Text; 
     cmd.Parameters.Add("@param2", SqlDbType.VarChar).Value = TextBox2.Text; 
     cmd.Parameters.Add("@param3", SqlDbType.VarChar).Value = TextBox3.Text; 

     var returnedId = cmd.ExecuteScalar(); 
    } 
} 

我沒有使用全部11個文本框,只是3來說明這項技術。

+0

,看看SQL。 – Kevin