2012-04-26 123 views
2

我有問題,當使用C#和MS Access數據庫將記錄插入表時,如何返回表的自動遞增ID。以下是我試過的代碼。在C#中插入查詢返回ID

string data1 = string.Format("insert into Enquiry(fname,mname,lname,date_of_enq,address,contact_no,email_id,course_id,other,probable_date,updated_date,status)values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}')", 
     txtfName.Text, txtmName.Text, txtlName.Text, fullDate.Text, txtaddress.Text, txtContactNo.Text, varemail, CBCourse.SelectedValue.ToString(), txtOther.Text, DTPFeedBackDate.Text, updated_date, status); 

我想要在表中自動遞增的插入記錄的ID。我怎麼才能得到它?

+0

小心格式化您的代碼? – 2012-04-26 05:35:51

+0

謹慎對待sql-injection? – 2012-04-26 05:37:35

+0

你的dbms是什麼? mssql,mysql,... ?? – 2012-04-26 05:39:14

回答

3

只需添加如SELECT @@IDENTITY到您的查詢,並執行此爲標量(注意,還有其他的方式,這取決於你的身份的範圍)

這適用於mssql - 對於其他系統,我正在等待您對我的評論的回答!

BTW:我不會用這種方法執行查詢 - 關鍵詞是SQL注入。而是去參數!

+0

thanx ...但我不知道如何添加插入查詢 – 2012-04-26 05:41:44

+0

'string data1 = string.Format(「insert into Inquiry(fname,mname,lname,date_of_enq,address,contact_no,email_id,course_id,other,probable_date, updated_date,狀態)的值( '{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}',「{ 7}','{8}','{9}','{10}','{11}'); SELECT @@ IDENTITY「, txtfName.Text,txtmName.Text,txtlName.Text,fullDate。文本,txtaddress.Text,txtContactNo.Text,Varemail,CBCourse.SelectedValue.ToString(),txtOther.Text,DTPFeedBackDate.Text,updated_date,狀態);' - 並不難,是嗎? – 2012-04-26 05:43:29

3

您可以使用下面:

Select Ident_Current(TableName); 

SELECT @@IDENTITY; 

SELECT SCOPE_IDENTITY(); 

SELECT @@ IDENTITY 它返回一個連接上生成的最後一個IDENTITY值,不管產生的數據表,也不論該語句的範圍是產生了價值。 @@ IDENTITY將返回在當前會話中輸入到表中的最後一個標識值。雖然@@ IDENTITY僅限於當前會話,但不限於當前範圍。如果在表上有一個觸發器,可以在另一個表中創建一個標識,則您將獲得最後創建的標識,即使它是創建該標識的觸發器。

SELECT SCOPE_IDENTITY() 它返回連接和同一範圍內的語句生成的最後一個IDENTITY值,而不管產生該值的表。 SCOPE_IDENTITY(),如@@ IDENTITY,將返回在當前會話中創建的最後一個標識值,但它也會將其限制在當前範圍內。換句話說,它將返回您明確創建的最後一個標識值,而不是由觸發器或用戶定義函數創建的任何標識。

SELECT IDENT_CURRENT('tablename') 它返回表中生成的最後一個IDENTITY值,而不管創建值的連接如何,也不管生成該值的語句的範圍如何。 IDENT_CURRENT不受範圍和會話的限制;它僅限於指定的表格。 IDENT_CURRENT返回爲任何會話和任何範圍中的特定表生成的標識值。

爲了避免以後將觸發相關的潛在問題,請始終使用SCOPE_IDENTITY()返回最近添加的行的身份在你的T SQL語句或存儲過程。

在MSACCESS

// Include a variable and a command to retrieve the identity value from the Access database. 
int newID = 0; 
OleDbCommand idCMD = new OleDbCommand("SELECT @@IDENTITY", nwindConn); 
// Retrieve the identity value and store it in the CategoryID column. 
newID = (int)idCMD.ExecuteScalar(); 
return newID; 
+1

'爲了避免以後將觸發相關的潛在問題,請始終使用SCOPE_IDENTITY()返回最近添加的行的身份在你的T SQL語句或存儲Procedure.' ...好...aaaannnd,因爲'SELECT IDENT_CURRENT('table');'沒有綁定到連接,所以它在任何情況下都不能在併發系統中正常工作(如果使用第二個stmt)(這是此解決方案的好處) – 2012-04-26 05:48:21

+0

全部這三個西裝在不同的問題領域,所以請參考鏈接並選擇對你更好的東西。謝謝安德烈亞斯。 – 2012-04-26 05:54:06

+0

我相信,您應該在答案中提供一些相關信息 - 或者至少指出,每個解決方案都有特定的領域......提及/指向需要檢測腦外部件的外部文章事實上,每個解決方案都有自己的領域,有點有害:),如果你認爲你必須遵循鏈接(根據你的設置做出正確的選擇),爲什麼包括// Best那麼 - 這是違反你的信念,並且不會受到任何影響,因此是無益的評論! – 2012-04-26 05:58:21