2

我有一个问题,当使用 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。我怎么才能得到它?

4

3 回答 3

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;
于 2012-04-26T05:38:30.330 回答
3

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

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

顺便说一句:我不会以这种方式执行查询 - 关键字是 sql-injection。而是去参数!

于 2012-04-26T05:38:39.090 回答
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());
于 2020-07-01T12:30:12.930 回答