引言
在开发Windows表单应用程序时,与数据库的交互是一个不可或缺的部分。本文介绍如何使用C#和OLEDB通过DatabaseManager
类来实现数据的增删改查(CRUD)操作。
设计DatabaseManager类
DatabaseManager
类封装了所有与数据库交互的逻辑,使用OLEDB提供程序来连接Access数据库。类的方法包括查询、添加、更新和删除数据,这些都是任何业务应用中的常见需求。
数据库连接
首先,定义一个连接字符串,指明OLEDB提供程序和数据源的路径:
private string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=*****.mdb";
查询数据
FindData
方法通过接收表名、列名和值参数来构建查询字符串,并使用参数化查询来防止SQL注入攻击:
/// <summary>
/// 通用数据查询方法
/// </summary>
/// <param name="dataGridView">DataGridView 控件</param>
/// <param name="tableName">表名</param>
/// <param name="column1">第一列名</param>
/// <param name="column2">第二列名</param>
/// <param name="value1">第一列的值</param>
/// <param name="value2">第二列的值</param>
public void FindData(DataGridView dataGridView, string tableName, string column1, string column2, string value1, string value2)
{
string selectQuery = $"SELECT * FROM {tableName}";
// 根据条件动态生成查询条件
if (!string.IsNullOrEmpty(value1) && string.IsNullOrEmpty(value2))
{
selectQuery += $" WHERE {column1} = @value1";
}
else if (string.IsNullOrEmpty(value1) && !string.IsNullOrEmpty(value2))
{
selectQuery += $" WHERE {column2} = @value2";
}
else if (!string.IsNullOrEmpty(value1) && !string.IsNullOrEmpty(value2))
{
selectQuery += $" WHERE {column1} = @value1 AND {column2} = @value2";
}
try
{
using (OleDbConnection connection = new OleDbConnection(connectionString))
using (OleDbDataAdapter adapter = new OleDbDataAdapter(selectQuery, connection))
{
if (!string.IsNullOrEmpty(value1))
{
adapter.SelectCommand.Parameters.AddWithValue("@value1", value1);
}
if (!string.IsNullOrEmpty(value2))
{
adapter.SelectCommand.Parameters.AddWithValue("@value2", value2);
}
DataTable dataTable = new DataTable();
adapter.Fill(dataTable);
// 将查询结果绑定到 DataGridView 控件上
dataGridView.DataSource = dataTable;
}
}
catch (Exception ex)
{
MessageBox.Show($"查询数据时发生错误:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
添加数据
使用AddData
方法,可以向指定表中插入数据。此方法构建了一个INSERT语句,并使用参数化查询来保证数据安全:
/// <summary>
/// 通用数据添加方法
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="columnNames">列名列表</param>
/// <param name="values">值列表</param>
public void AddData(string tableName, List<string> columnNames, List<string> values)
{
string columns = string.Join(", ", columnNames);
string parameters = string.Join(", ", columnNames.Select(name => "@" + name));
string strsql = $"INSERT INTO {tableName} ({columns}) VALUES ({parameters})";
using (OleDbConnection objConn = new OleDbConnection(connectionString))
using (OleDbCommand objcomm = new OleDbCommand(strsql, objConn))
{
for (int i = 0; i < columnNames.Count; i++)
{
objcomm.Parameters.AddWithValue("@" + columnNames[i], values[i]);
}
int n = 0;
try
{
objConn.Open();
n = objcomm.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show("添加失败:" + ex.Message);
return;
}
if (n > 0)
{
MessageBox.Show("添加成功 ;)");
}
else
{
MessageBox.Show("添加失败 ;(");
}
}
}
更新数据
UpdateData
方法允许更新表中的数据。它通过构建一个UPDATE语句并同样使用参数化查询来实现:
/// <summary>
/// 通用数据更新方法
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="idColumn">ID列名</param>
/// <param name="idValue">ID值</param>
/// <param name="columnNames">列名列表</param>
/// <param name="values">值列表</param>
public void UpdateData(string tableName, string idColumn, string idValue, List<string> columnNames, List<string> values)
{
string setClause = string.Join(", ", columnNames.Select(name => $"{name}=@{name}"));
string updateQuery = $"UPDATE {tableName} SET {setClause} WHERE {idColumn} = @{idColumn}";
using (OleDbConnection connection = new OleDbConnection(connectionString))
using (OleDbCommand command = new OleDbCommand(updateQuery, connection))
{
for (int i = 0; i < columnNames.Count; i++)
{
command.Parameters.AddWithValue("@" + columnNames[i], values[i]);
}
command.Parameters.AddWithValue("@" + idColumn, idValue);
try
{
connection.Open();
int rowsAffected = command.ExecuteNonQuery();
if (rowsAffected > 0)
{
MessageBox.Show("修改成功 ;)");
}
else
{
MessageBox.Show("未找到匹配的信息,请检查参数是否正确。");
}
}
catch (Exception ex)
{
MessageBox.Show($"修改失败:{ex.Message}");
}
}
}
删除数据
最后,DeleteData
方法用于从表中删除一条记录。它构建了一个DELETE语句,并执行:
/// <summary>
/// 通用数据删除方法
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="idColumn">ID列名</param>
/// <param name="idValue">ID值</param>
public void DeleteData(string tableName, string idColumn, string idValue)
{
string deleteQuery = $"DELETE FROM {tableName} WHERE {idColumn}=@{idColumn}";
try
{
using (OleDbConnection connection = new OleDbConnection(connectionString))
using (OleDbCommand command = new OleDbCommand(deleteQuery, connection))
{
command.Parameters.AddWithValue("@" + idColumn, idValue);
connection.Open();
int rowsAffected = command.ExecuteNonQuery();
if (rowsAffected > 0)
{
MessageBox.Show("删除成功 ;)");
}
else
{
MessageBox.Show("未找到匹配的编号,请确认是否存在此编号。");
}
}
}
catch (Exception ex)
{
MessageBox.Show($"删除失败:{ex.Message}");
}
}
查找数据库的最大ID
在进行数据库添加时,往往需要先获取ID的最大值,然后根据最大值在进行数据添加:
public int GetNewID(string tableName)
{
// 查询当前数据表中的最大ID值
string query = $"SELECT MAX(ID) FROM {tableName}";
using (OleDbConnection connection = new OleDbConnection(connectionString))
using (OleDbCommand command = new OleDbCommand(query, connection))
{
connection.Open();
object result = command.ExecuteScalar();
if (result != DBNull.Value && result != null)
{
return Convert.ToInt32(result) + 1;
}
else
{
return 1; // 如果数据表为空,则从1开始编号
}
}
}
总结
使用C#和OLE DB在Windows Forms应用程序中实现数据库操作是一种高效的方法。通过封装所有数据库操作逻辑在DatabaseManager
类中,我们不仅使代码更加模块化,还提高了代码的可维护性和安全性。希望这篇文章能帮助你在自己的项目中实现类似功能。