2012-04-26 84 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