利用C#和OLEDB在WinForms中高效管理数据库操作

引言

在开发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类中,我们不仅使代码更加模块化,还提高了代码的可维护性和安全性。希望这篇文章能帮助你在自己的项目中实现类似功能。

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值