首页 > 关注

C#写一套最全的MySQL帮助类(包括增删改查)_世界播资讯

来源:博客园 时间:2023-04-21 11:50:03


(资料图)

介绍说明:这个帮助类包含了六个主要的方法: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 data)    {        string[] columns = new string[data.Count];        object[] values = new object[data.Count];        int i = 0;        foreach (KeyValuePair 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 data, string whereClause = "")    {        string[] setValues = new string[data.Count];        int i = 0;        foreach (KeyValuePair 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 data)    {        List parameters = new List();        foreach (KeyValuePair 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 data = new Dictionary();data.Add("column1", "value1");data.Add("column2", 123);int result = mySQLHelper.Insert("myTable", data);// 更新数据Dictionary data = new Dictionary();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

相关稿件

C#写一套最全的MySQL帮助类(包括增删改查)_世界播资讯

贝壳研究院:4月百城首套主流房贷利率微降|热门

两部门印发安全指南 剧本娱乐经营场所应设置火灾自动报警系统等

高丽红参怎么吃效果最好_高丽红

当前动态:电缆网套_电缆网

孟妲施老师还在湘郡未来实验学校吗_孟妲施|世界时讯

天天即时:张杰演唱会门票尺寸_门票尺寸

世界快报:浦发银行深汕支行成功阻截冒充电商客服诈骗案

2023年度深圳市点燃学习培训班“1+11+N”开班仪式在“发源地”宝安举行-全球播资讯

全球新动态:抚州教育体育局_抚州教育局

全球观天下!清风明月的意思是什么生肖_清风明月的意思

人为什么要睡觉说明文阅读答案_人为什么要睡觉

天天通讯!阅读新时代 长安向未来 ——西安市浐灞十二小第四届“读书月”启动仪式

杭叉集团:一季度归母净利润2.92亿元,同比增53.55% 世界讯息

寒武纪20CM涨停:公司不直接从事人工智能最终应用产品的开发和销售

天天资讯:“冰墩墩”概念股元隆雅图去年净利大增44%,控股股东、高管频频套现

25万元的百安居全包装修合同 装修卫生间不含淋浴房,合理吗?

当前简讯:工业富联涨停 机构净买入7.47亿元

鹏鼎控股涨停 机构净买入2.26亿元

沪媒:巴勒斯坦将参加亚洲杯,热身赛可视作国足的“模拟考”

全球即时看!美股热门中概股普跌,理想汽车跌超6%

初中叛逆期的男孩子怎么去引导?

高腰小脚裤搭配超短款时尚外套,打造时髦洋气感,看起来非常高级

天天通讯!35和的女人不要只会穿靴子,今春流行这“3双鞋子”,优雅又显高

联合国称南亚有2.9亿童养媳,占全球总数的45%

全国首支商业秘密保护志愿服务队成立

焦点快播:深圳地铁推出“虚拟单程票” 方便口岸通关和外地来深旅客乘车

深圳构建“黄金四分钟”应急救援圈一年见效 “救命神器”装到市民家门口

看!海书房 看见图书馆 专属于盐田区图书馆的诗意文化徽章

为什么不建议买储蓄国债?储蓄国债几点开始销售?