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

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

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

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

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();
    }
}

View Code

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

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

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

View Code

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

C#写一套最全的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");

View Code

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

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

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

//是的,使用参数化查询是避免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

 

原文链接:https://www.cnblogs.com/wxsdyz/archive/2023/04/21/17339519.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#写一套最全的MySQL帮助类(包括增删改查) - Python技术站

(0)
上一篇 2023年4月22日
下一篇 2023年4月22日

相关文章

  • 未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序报错的解决办法

    当在本地计算机上使用Microsoft Office相关库时,可能会出现“未在本地计算机上注册microsoft.ACE.oledb.12.0”提供程序的报错。这是由于缺少相关的驱动程序或者未安装相应的软件所导致的。下面是解决该问题的完整攻略。 1. 确认公司计算机已安装“Microsoft Access Database Engine” “Microsof…

    C# 2023年5月15日
    00
  • 12个Visual Studio调试效率技巧(小结)

    12个Visual Studio调试效率技巧(小结) Visual Studio是开发人员常用的IDE之一,它提供了丰富的功能和工具来帮助我们更快、更准确地开发和调试代码。在这篇文章中,我向大家分享了12个Visual Studio调试效率技巧,让我们在调试代码时更加高效。 技巧1:使用断点条件 有时候,我们只想在特定情况下停止代码的执行,这时我们可以使用断…

    C# 2023年6月3日
    00
  • 深入分析C#连接Oracle数据库的连接字符串详解

    那么让我们开始“深入分析C#连接Oracle数据库的连接字符串详解”的完整攻略。 标题 深入分析C#连接Oracle数据库的连接字符串详解 简介 在使用C#编写与Oracle数据库交互的应用程序时,必须使用正确的连接字符串。本文旨在为读者提供一份易于理解的C#连接Oracle数据库的连接字符串详解,帮助读者加强对Oracle数据库连接字符串的理解。 步骤 步…

    C# 2023年6月1日
    00
  • c#创建vc可调用的com组件方法分享

    下面我就来详细讲解一下“C#创建VC可调用的COM组件方法分享”的完整攻略。 1. 确定组件需求 首先,我们需要确定下自己需要开发什么样的组件,这是COM组件开发的第一步。根据需求确定组件接口和类,建议先画一张组件结构图,方便我们更好地理解组件整体架构。 2. 创建COM组件项目 打开Visual Studio创建新的C# Class Library项目,选…

    C# 2023年6月7日
    00
  • c#入门之实现简易存款利息计算器示例

    C#入门之实现简易存款利息计算器示例攻略 1. 简介 存款利息计算器是一款简单、实用的工具,可以帮助用户计算存款到期后应得的利息。在本篇攻略中,我们将使用C#编程语言来实现一个简单的存款利息计算器。 2. 实现步骤 2.1 创建项目 首先,我们需要打开Visual Studio并创建一个新项目。选择菜单栏中的“文件”->“新建”->“项目”,在弹…

    C# 2023年6月7日
    00
  • C#实现简单屏幕监控的方法

    当我们需要监控并获取系统正在运行的一些信息时,屏幕监控便是一种非常有效的手段。在C#语言中,我们可以通过System.Windows.Forms这个库来实现简单的屏幕监控。 获取屏幕上的图像数据 第一步是获取屏幕上的图像数据。我们可以使用Screen类来获取当前屏幕的宽、高等参数,然后通过Graphics类的CopyFromScreen方法将屏幕上的图像数据…

    C# 2023年6月6日
    00
  • C#中内联函数的用法介绍

    C#中内联函数的用法介绍 在C#中,我们可以使用内联函数(Inline Function)来优化代码的执行速度。内联函数是指编译器将函数调用直接展开成函数体,从而避免了函数调用的开销,提高了程序的执行效率。 何时使用内联函数 在一些频繁调用的简单函数中,使用内联函数可以避免频繁的函数调用开销,从而提高程序的执行效率。 需要注意的是,内联函数的代价是代码的体积…

    C# 2023年6月7日
    00
  • 在Winform分页控件中集成保存用户列表显示字段及宽度调整设置

    在Winform的分页控件里面,我们提供了很多丰富的功能,如常规分页,中文转义、导出Excel、导出PDF等,基于DevExpress的样式的分页控件,我们在其上面做了不少封装,以便更好的使用,其中就包括集成保存用户列表显示字段及宽度调整设置。本篇随笔介绍这个实现的过程,通过在当前程序中序列化方式存储一个记录用户设置的文件,提供介质的存储和加载处理。 1、集…

    C# 2023年5月11日
    00
合作推广
合作推广
分享本页
返回顶部