在C#中如何获取Access数据库新增记录的自动生成主键值?
获取Access自增主键值的正确实现(OleDB)
要解决新增记录后获取自增主键的问题,别用重新查询数据库的方式(避免重复记录定位失败),直接用Access的@@IDENTITY函数即可,同时你的原代码存在SQL注入风险,必须改成参数化查询,以下是具体实现:
核心思路
在同一个数据库连接会话中,先执行INSERT操作,紧接着执行SELECT @@IDENTITY,这个函数会返回当前连接中最后生成的自增主键值,完全不会受重复记录影响。
完整代码示例
// 定义变量存储新生成的主键 int newPayInfoId = 0; // 使用using块自动释放资源,避免连接泄露 using (OleDbConnection connection = new OleDbConnection("你的数据库连接字符串")) { connection.Open(); // 1. 执行插入操作(参数化写法) using (OleDbCommand insertCommand = connection.CreateCommand()) { insertCommand.CommandText = @" INSERT INTO PayInfo ([UserID], [FullName], [CardType], [CardNo], [CVV], [ExpDate], [Address]) VALUES (@UserID, @FullName, @CardType, @CardNo, @CVV, @ExpDate, @Address) "; // 添加参数,替换原有的字符串拼接 insertCommand.Parameters.AddWithValue("@UserID", Global.UserID); insertCommand.Parameters.AddWithValue("@FullName", PayInfo[6]); insertCommand.Parameters.AddWithValue("@CardType", PayInfo[0]); insertCommand.Parameters.AddWithValue("@CardNo", PayInfo[1]); insertCommand.Parameters.AddWithValue("@CVV", PayInfo[2]); insertCommand.Parameters.AddWithValue("@ExpDate", exp); insertCommand.Parameters.AddWithValue("@Address", adress); // 执行插入 insertCommand.ExecuteNonQuery(); } // 2. 获取刚生成的自增主键 using (OleDbCommand idCommand = connection.CreateCommand()) { idCommand.CommandText = "SELECT @@IDENTITY"; // ExecuteScalar返回查询结果的第一行第一列 newPayInfoId = Convert.ToInt32(idCommand.ExecuteScalar()); } connection.Close(); } // 返回新主键值(可根据需求调整返回逻辑) return newPayInfoId;
关键说明
- 为什么不用重新查询?:如果存在除主键外完全相同的记录,你无法精准定位到刚新增的那条,而
@@IDENTITY基于当前连接会话,只会返回本次插入生成的ID,绝对准确。 - 必须用参数化查询:原代码直接拼接SQL字符串,不仅容易因为字段值含单引号导致语法错误,还会被SQL注入攻击,参数化写法从根源解决这两个问题。
内容的提问来源于stack exchange,提问作者Milosz Wedrowski
相关产品推荐
相关产品推荐

