• C#写一套最全的MySQL帮助类(包括增删改查)


    介绍说明:
    这个帮助类包含了六个主要的方法:
    ExecuteNonQuery、ExecuteScalar、ExecuteQuery、ExecuteQuery(泛型)、Insert、Update和Delete。
    其中,ExecuteNonQuery用于执行不返回结果集的SQL语句;
    ExecuteScalar用于执行一个查询,并返回结果集中第一行的第一列;
    ExecuteQuery用于执行一个查询,并返回结果集;
    ExecuteQuery(泛型)用于执行一个查询,并将结果集映射到一个对象列表;
    Insert用于向数据库中插入数据;
    Update用于更新数据库中的数据;
    Delete用于删除数据库中的数据。

    一、以下是一个基于C#的MySQL帮助类的示例代码,可以用于连接数据库、执行SQL语句、读取数据等操作:

    using System;
    using System.Collections.Generic;
    using System.Data;
    using MySql.Data.MySqlClient;
    
    public class MySQLHelper
    {
        private string connectionString;
    
        public MySQLHelper(string connectionString)
        {
            this.connectionString = connectionString;
        }
    
        // 执行不返回结果集的SQL语句
        public int ExecuteNonQuery(string sql, params MySqlParameter[] parameters)
        {
            using (MySqlConnection connection = new MySqlConnection(connectionString))
            {
                using (MySqlCommand command = new MySqlCommand(sql, connection))
                {
                    // 添加参数
                    command.Parameters.AddRange(parameters);
                    // 打开连接
                    connection.Open();
                    // 执行SQL语句并返回影响行数
                    return command.ExecuteNonQuery();
                }
            }
        }
    
        // 执行一个查询,并返回结果集中第一行的第一列
        public object ExecuteScalar(string sql, params MySqlParameter[] parameters)
        {
            using (MySqlConnection connection = new MySqlConnection(connectionString))
            {
                using (MySqlCommand command = new MySqlCommand(sql, connection))
                {
                    // 添加参数
                    command.Parameters.AddRange(parameters);
                    // 打开连接
                    connection.Open();
                    // 执行SQL查询并返回第一行第一列的值
                    return command.ExecuteScalar();
                }
            }
        }
    
        // 执行一个查询,并返回结果集
        public DataTable ExecuteQuery(string sql, params MySqlParameter[] parameters)
        {
            using (MySqlConnection connection = new MySqlConnection(connectionString))
            {
                using (MySqlCommand command = new MySqlCommand(sql, connection))
                {
                    // 添加参数
                    command.Parameters.AddRange(parameters);
                    // 打开连接
                    connection.Open();
                    // 创建DataAdapter和DataTable对象,并填充数据
                    using (MySqlDataAdapter adapter = new MySqlDataAdapter(command))
                    {
                        DataTable dataTable = new DataTable();
                        adapter.Fill(dataTable);
                        return dataTable;
                    }
                }
            }
        }
    
        // 执行一个查询,并将结果集映射到一个对象列表
        public List ExecuteQuery(string sql, Func selector, params MySqlParameter[] parameters)
        {
            using (MySqlConnection connection = new MySqlConnection(connectionString))
            {
                using (MySqlCommand command = new MySqlCommand(sql, connection))
                {
                    // 添加参数
                    command.Parameters.AddRange(parameters);
                    // 打开连接
                    connection.Open();
                    // 创建DataReader对象并读取数据,将每行数据映射到对象并添加到列表中
                    using (MySqlDataReader reader = command.ExecuteReader())
                    {
                        List list = new List();
                        while (reader.Read())
                        {
                            list.Add(selector(reader));
                        }
                        return list;
                    }
                }
            }
        }
    
        // 向数据库中插入数据
        public int Insert(string tableName, Dictionary<string, object> data)
        {
            string[] columns = new string[data.Count];
            object[] values = new object[data.Count];
    
            int i = 0;
            foreach (KeyValuePair<string, object> item in data)
            {
                // 获取列名和值
                columns[i] = item.Key;
                values[i] = item.Value;
                i++;
            }
    
            string sql = string.Format("INSERT INTO {0} ({1}) VALUES ({2})", tableName, string.Join(",", columns), "@" + string.Join(",@", columns));
    
            // 将Dictionary转换为MySqlParameter数组,并执行SQL语句
            return ExecuteNonQuery(sql, ToMySqlParameters(data));
        }
    
        // 更新数据库中的数据
        public int Update(string tableName, Dictionary<string, object> data, string whereClause = "")
        {
            string[] setValues = new string[data.Count];
            int i = 0;
            foreach (KeyValuePair<string, object> item in data)
            {
                // 获取列名和值
                setValues[i] = string.Format("{0}=@{0}", item.Key);
                i++;
            }
    
            string sql = string.Format("UPDATE {0} SET {1}", tableName, string.Join(",", setValues));
    
            if (!string.IsNullOrEmpty(whereClause))
            {
                sql += " WHERE " + whereClause;
            }
    
            // 将Dictionary转换为MySqlParameter数组,并执行SQL语句
            return ExecuteNonQuery(sql, ToMySqlParameters(data));
        }
    
        // 删除数据库中的数据
        public int Delete(string tableName, string whereClause = "")
        {
            string sql = string.Format("DELETE FROM {0}", tableName);
    
            if (!string.IsNullOrEmpty(whereClause))
            {
                sql += " WHERE " + whereClause;
            }
    
            // 执行SQL语句并返回影响
    
            return ExecuteNonQuery(sql);
        }
        // 将Dictionary转换为MySqlParameter数组
        private MySqlParameter[] ToMySqlParameters(Dictionary<string, object> data)
        {
            List parameters = new List();
    
            foreach (KeyValuePair<string, object> item in data)
            {
                parameters.Add(new MySqlParameter("@" + item.Key, item.Value));
            }
    
            return parameters.ToArray();
        }
    }
    View Code

    二、另外,在使用这个帮助类时,需要先创建一个连接字符串,例如

    string connectionString = "server=localhost;database=myDatabase;uid=myUsername;password=myPassword;";
    MySQLHelper mySQLHelper = new MySQLHelper(connectionString);
    View Code

    三、然后就可以使用这个帮助类来访问MySQL数据库了。下面是一些示例代码:

    // 查询所有数据
    DataTable dataTable = mySQLHelper.ExecuteQuery("SELECT * FROM myTable");
    foreach (DataRow row in dataTable.Rows)
    {
        Console.WriteLine(row["column1"].ToString());
    }
    
    
    // 查询单个值
    object value = mySQLHelper.ExecuteScalar("SELECT COUNT(*) FROM myTable");
    Console.WriteLine(value.ToString());
    
    
    // 查询并映射到对象列表
    List list = mySQLHelper.ExecuteQuery("SELECT * FROM myTable", r => new MyClass
    {
        Column1 = r["column1"].ToString(),
        Column2 = int.Parse(r["column2"].ToString())
    });
    
    
    // 插入数据
    Dictionary<string, object> data = new Dictionary<string, object>();
    data.Add("column1", "value1");
    data.Add("column2", 123);
    int result = mySQLHelper.Insert("myTable", data);
    
    
    // 更新数据
    Dictionary<string, object> data = new Dictionary<string, object>();
    data.Add("column1", "value2");
    data.Add("column2", 456);
    int result = mySQLHelper.Update("myTable", data, "id=1");
    
    
    // 删除数据
    int result = mySQLHelper.Delete("myTable", "id=1");
    View Code

                   注:这些示例代码展示了如何使用这个帮助类来执行常见的MySQL操作,例如查询、插入、更新和删除数据。请注意,在执行SQL语句时,要避免SQL注入攻击,可以使用参数化查询来确保安全。

    四、就上述SQL注入攻击,防范例子:

    //是的,使用参数化查询是避免SQL注入攻击的重要方法之一。C#中可以使用MySqlParameter类来创建参数化查询,下面简单介绍一下如何使用MySqlParameter类。
    //首先,看一个普通的SQL语句:
          string sql = "SELECT * FROM Users WHERE name='" + userName + "' AND password='" + password + "'";
    //这个SQL语句接收两个字符串类型的参数:userName和password。但是,如果恶意用户在输入用户名或密码时添加了SQL代码,则可能会导致SQL注入攻击。例如,如果用户输入了以下内容作为密码:
          a' OR 'a'='a
     //则生成的SQL语句将变成:
          SELECT* FROM Users WHERE name='xxx' AND password = 'a' OR 'a'='a'
    //这个SQL语句将始终返回true,因为'a'='a'是永远成立的,所以用户可以绕过登录验证并访问数据库。
    
    //为了避免这种情况发生,我们可以使用MySqlParameter类来创建参数化查询。以下是一个示例:
          string sql = "SELECT * FROM Users WHERE name=@UserName AND password=@Password";
          using (MySqlConnection connection = new MySqlConnection(connectionString))
          {
              using (MySqlCommand command = new MySqlCommand(sql, connection))
              {
                  // 创建参数
                  command.Parameters.Add(new MySqlParameter("@UserName", userName));
                  command.Parameters.Add(new MySqlParameter("@Password", password));
                  
                  // 打开连接并执行查询
                  connection.Open();
                  using (MySqlDataReader reader = command.ExecuteReader())
                  {
                      // 处理结果集
                  }
              }
          }
    //在这个示例中,我们使用了 @符号来标记参数名称,并使用MySqlParameter类为每个参数创建实例。这样,即使用户在输入用户名或密码时添加了SQL代码,它也不会影响生成的SQL语句。
    //总之,使用参数化查询是一个非常重要的安全措施,可以有效预防SQL注入攻击,C#提供了方便易用的MySqlParameter类来支持参数化查询。
    View Code

     

  • 相关阅读:
    1.网络IO与select学习
    【IPC】消息队列
    蚁群优化算法在具有时间窗的车辆路径问题中的应用:MATLAB实现及详解
    Trino Worker 规避 OOM 思路
    关于pandas dataframe数据转换为JSON格式存储在Redis后,读取数据时发生数据篡改的问题以及解决办法
    笙默考试管理系统-MyExamTest----codemirror(26)
    springboot毕设项目宠爱有家atah1(java+VUE+Mybatis+Maven+Mysql)
    C++算法:全 O(1) 的数据结构
    ubuntu Setforeground 前台应用切换
    【Vue基础十三】---Vuex的求和案例--map辅助函数的使用
  • 原文地址:https://www.cnblogs.com/wxsdyz/p/17339519.html