隐藏

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

发布:2024/3/26 23:04:31作者:管理员 来源:本站 浏览次数:475

目录


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


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


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


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


介绍说明:

这个帮助类包含了六个主要的方法:

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<T> ExecuteQuery<T>(string sql, Func<IDataRecord, T> 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<T> list = new List<T>();

                       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<MySqlParameter> parameters = new List<MySqlParameter>();

   

           foreach (KeyValuePair<string, object> item in data)

           {

               parameters.Add(new MySqlParameter("@" + item.Key, item.Value));

           }

   

           return parameters.ToArray();

       }

   }


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


   string connectionString = "server=localhost;database=myDatabase;uid=myUsername;password=myPassword;";

   MySQLHelper mySQLHelper = new MySQLHelper(connectionString);


三、然后就可以使用这个帮助类来访问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<MyClass> 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");


注:这些示例代码展示了如何使用这个帮助类来执行常见的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类来支持参数化查询。