如何从MS Access数据表提取自动编号值并转换为Int64(C# ASP.NET场景)
C# 从MS Access获取自动编号并转Int64的实现方法
核心逻辑说明
Access的默认自动编号为32位长整型(Int32),直接转换为Int64不存在精度丢失问题,转换前需先判空避免DBNull引发的异常。
实现步骤
1. 引入必要命名空间
using System.Data.OleDb;
2. 场景1:查询现有记录的id并转换
// 替换为你的Access文件路径 string connStr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\your_database.accdb;Persist Security Info=False;"; long targetId = 0; using (OleDbConnection conn = new OleDbConnection(connStr)) { conn.Open(); string sql = "SELECT id FROM your_table WHERE 条件列 = ?"; using (OleDbCommand cmd = new OleDbCommand(sql, conn)) { // 替换为你的查询参数 cmd.Parameters.AddWithValue("@param", "你的查询条件"); object result = cmd.ExecuteScalar(); // 先判空再转换,避免DBNull异常 if (result != null && result != DBNull.Value) { targetId = Convert.ToInt64(result); } } }
3. 场景2:插入新记录后获取最新自动编号并转换
Access不支持SCOPE_IDENTITY(),使用@@IDENTITY获取当前会话的最新自增id:
string connStr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\your_database.accdb;Persist Security Info=False;"; long newId = 0; using (OleDbConnection conn = new OleDbConnection(connStr)) { conn.Open(); // 先执行插入操作 string insertSql = "INSERT INTO your_table (列1, 列2) VALUES (?, ?)"; using (OleDbCommand insertCmd = new OleDbCommand(insertSql, conn)) { insertCmd.Parameters.AddWithValue("@col1", "值1"); insertCmd.Parameters.AddWithValue("@col2", "值2"); insertCmd.ExecuteNonQuery(); } // 取最新自增id string getIdSql = "SELECT @@IDENTITY"; using (OleDbCommand getIdCmd = new OleDbCommand(getIdSql, conn)) { object result = getIdCmd.ExecuteScalar(); if (result != null && result != DBNull.Value) { newId = Convert.ToInt64(result); } } }
注意事项
- 若使用.mdb格式的旧版Access文件,连接字符串的Provider替换为
Microsoft.Jet.OLEDB.4.0即可 - 不要直接用
(long)result强转,若返回值为Int32类型时直接强转会抛类型转换异常,Convert.ToInt64()会自动处理兼容不同整数类型的转换 - 多线程高并发插入场景下,
@@IDENTITY不会出现取错id的问题,它的作用范围是当前数据库连接会话
内容的提问来源于stack exchange,提问作者Kaise karen
相关产品推荐
相关产品推荐

