从C#中的插入查询返回ID

时间:2012-04-26 05:33:28

标签: c# .net database ms-access ado.net

我遇到问题,当使用C#和MS Access数据库在表中插入记录时,如何返回表的自动递增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,它在表中自动递增。我怎么能得到它?

3 个答案:

答案 0 :(得分:3)

您可以使用以下内容:

Select Ident_Current(TableName); 

SELECT @@IDENTITY;

SELECT SCOPE_IDENTITY();

SELECT @@ IDENTITY 它返回在连接上生成的最后一个IDENTITY值,无论生成该值的表如何,也不管生成该值的语句的范围如何。 @@ IDENTITY将返回在当前会话中输入到表中的最后一个标识值。虽然@@ IDENTITY仅限于当前会话,但不限于当前范围。如果您在表上触发了导致在另一个表中创建标识的触发器,您将获得最后创建的标识,即使它是创建它的触发器。

SELECT SCOPE_IDENTITY() 它返回在连接上生成的最后一个IDENTITY值以及同一范围内的语句,而不管生成该值的表。 与@@ IDENTITY一样,SCOPE_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 :(得分:3)

只需将SELECT @@IDENTITY添加到您的查询中,并将其作为标量执行(请注意,还有其他方法,具体取决于您的身份范围)

这适用于mssql - 对于其他系统我正在等待你对我的评论的回答!

btw:我不会以这种方式执行查询 - 关键字是sql-injection。而是去寻找参数!

答案 2 :(得分:0)

此C#代码使用 Oracle.ManagedDataAccess 4.121.1.0库为我工作:

OracleConnection conn = oracleConnLicen();
OracleCommand cmd = conn.CreateCommand();

conn.Open();
cmd.CommandText = "INSERT INTO account (name) VALUES ('Adam') RETURNING id INTO :p_id";

然后在ExecuteNonQuery之前

OracleParameter pId = new OracleParameter("p_id", OracleDbType.Int32)
    {
        Direction = ParameterDirection.Output
    };
cmd.Parameters.Add(pId);

cmd.ExecuteNonQuery();
return Convert.ToInt32(pId.Value.ToString());