在C#项目里操作Access数据库时,每次都手动创建OleDbConnection、OleDbCommand对象,处理连接打开关闭、异常捕获等逻辑,会产出大量重复代码。封装一个通用的OleDbHelper类,可以把这些公共操作统一管理,让业务层调用数据库操作时更简洁。

OleDbHelper核心设计思路
通用访问类需要覆盖几个核心场景:执行非查询语句(增删改)、执行查询返回DataTable、执行查询返回单个值、执行查询返回DataReader。同时需要处理连接字符串配置、参数化查询避免SQL注入、资源自动释放等问题。
连接字符串配置
Access数据库的连接字符串需要指定Provider和数据库文件路径,建议放在配置文件里方便修改,这里先定义默认的连接字符串常量用于示例:
using System;
using System.Data;
using System.Data.OleDb;
using System.Configuration;
public class OleDbHelper
{
// 默认连接字符串,实际项目可从ConfigurationManager.AppSettings获取
private static readonly string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\TestDb.accdb;";
// 也可提供外部传入连接字符串的构造方式
private string customConnectionString;
public OleDbHelper(string connStr)
{
customConnectionString = connStr;
}
// 获取最终使用的连接字符串
private string GetConnectionString()
{
return string.IsNullOrEmpty(customConnectionString) ? connectionString : customConnectionString;
}
}创建并打开连接的方法
封装连接创建逻辑,确保连接状态正常,同时避免重复编写连接初始化代码:
private OleDbConnection GetConnection()
{
OleDbConnection conn = new OleDbConnection(GetConnectionString());
if (conn.State != ConnectionState.Open)
{
conn.Open();
}
return conn;
}核心操作方法实现
执行非查询语句(增删改)
该方法用于执行INSERT、UPDATE、DELETE等不返回结果集的SQL语句,支持参数化传入,避免SQL注入:
public int ExecuteNonQuery(string sql, params OleDbParameter[] parameters)
{
using (OleDbConnection conn = GetConnection())
{
using (OleDbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
cmd.CommandType = CommandType.Text;
if (parameters != null && parameters.Length > 0)
{
cmd.Parameters.AddRange(parameters);
}
return cmd.ExecuteNonQuery();
}
}
}执行查询返回DataTable
适用于需要获取多行多列结果的查询场景,比如查询列表数据:
public DataTable ExecuteDataTable(string sql, params OleDbParameter[] parameters)
{
using (OleDbConnection conn = GetConnection())
{
using (OleDbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
cmd.CommandType = CommandType.Text;
if (parameters != null && parameters.Length > 0)
{
cmd.Parameters.AddRange(parameters);
}
using (OleDbDataAdapter adapter = new OleDbDataAdapter(cmd))
{
DataTable dt = new DataTable();
adapter.Fill(dt);
return dt;
}
}
}
}执行查询返回单个值
用于查询COUNT、SUM等聚合函数,或者查询单个字段的单行结果:
public object ExecuteScalar(string sql, params OleDbParameter[] parameters)
{
using (OleDbConnection conn = GetConnection())
{
using (OleDbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
cmd.CommandType = CommandType.Text;
if (parameters != null && parameters.Length > 0)
{
cmd.Parameters.AddRange(parameters);
}
return cmd.ExecuteScalar();
}
}
}执行查询返回DataReader
适用于需要逐行读取大量数据的场景,注意DataReader使用完需要及时关闭:
public OleDbDataReader ExecuteReader(string sql, params OleDbParameter[] parameters)
{
OleDbConnection conn = GetConnection();
OleDbCommand cmd = conn.CreateCommand();
cmd.CommandText = sql;
cmd.CommandType = CommandType.Text;
if (parameters != null && parameters.Length > 0)
{
cmd.Parameters.AddRange(parameters);
}
// CommandBehavior.CloseConnection 保证DataReader关闭时自动关闭连接
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}使用示例
下面演示几个常见的调用场景,直观展示OleDbHelper的使用方式:
新增数据示例
// 新增用户数据
string insertSql = "INSERT INTO UserTable (UserName, Age) VALUES (?, ?)";
OleDbParameter[] insertParams = new OleDbParameter[]
{
new OleDbParameter("@UserName", "张三"),
new OleDbParameter("@Age", 25)
};
int affectedRows = OleDbHelper.ExecuteNonQuery(insertSql, insertParams);
Console.WriteLine($"新增成功,影响行数:{affectedRows}");查询列表数据示例
// 查询所有年龄大于20的用户
string querySql = "SELECT * FROM UserTable WHERE Age > ?";
OleDbParameter[] queryParams = new OleDbParameter[]
{
new OleDbParameter("@Age", 20)
};
DataTable userDt = OleDbHelper.ExecuteDataTable(querySql, queryParams);
foreach (DataRow row in userDt.Rows)
{
Console.WriteLine($"用户名:{row["UserName"]},年龄:{row["Age"]}");
}查询单个值示例
// 查询用户总数
string countSql = "SELECT COUNT(*) FROM UserTable";
object countObj = OleDbHelper.ExecuteScalar(countSql);
int totalCount = Convert.ToInt32(countObj);
Console.WriteLine($"用户总数:{totalCount}");注意事项
- Access的参数占位符使用问号
?,参数添加顺序需要和SQL里的问号顺序一致,不支持命名参数匹配。 - 如果操作的是旧版
.mdb格式的Access数据库,需要把连接字符串的Provider改为Microsoft.Jet.OLEDB.4.0。 - 使用
ExecuteReader方法返回的DataReader时,需要在使用完后手动关闭,或者通过using语句包裹确保资源释放。 - 实际项目中建议把连接字符串放到
app.config或web.config配置文件里,避免硬编码。
C#OleDbHelperAccess数据库ADO.NETOleDb修改时间:2026-06-07 01:02:10