C#寫一套最全的MySQL幫助類(包括增刪改查)

来源:https://www.cnblogs.com/wxsdyz/archive/2023/04/21/17339519.html
-Advertisement-
Play Games

介紹說明:這個幫助類包含了六個主要的方法:ExecuteNonQuery、ExecuteScalar、ExecuteQuery、ExecuteQuery(泛型)、Insert、Update和Delete。其中,ExecuteNonQuery用於執行不返回結果集的SQL語句;ExecuteScalar ...


介紹說明:
這個幫助類包含了六個主要的方法:
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();
    }
}
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<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註入攻擊,防範例子:

//是的,使用參數化查詢是避免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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • The Types of Associations 在 Rails 中,可以通過 ActiveRecord 來定義不同類型的關聯關係(Associations),包括以下幾種: belongs_to:表示該模型 belongs_to 另一個模型,即該模型擁有一個外鍵(foreign key)指向另一 ...
  • springBoot自定義cron表達式註冊定時任務 一、原理 1、使用Spring自帶的TaskScheduler註冊任務 2、註冊後返回:ScheduledFuture,用於取消定時任務 3、註冊任務後不會馬上取消任務,所以將任務緩存。在需要取消任務的時候調用取消介面取消 4、cron表達式可以 ...
  • 本篇介紹了JVM中垃圾回收器相關的基礎知識,後續會深入介紹CMS、G1、ZGC等不同垃圾收集器的運作流程和原理,歡迎關註。 ...
  • 這輩子不想再看到jedisBrokenPipe!! 測試環境運行16天後報錯信息: 05:42:32.629 [http-nio-8093-exec-2] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - [log,175] - Servlet.service( ...
  • chatGPT正式發佈已經有段時間了,這段時間我也深度體驗了chatGPT的魅力。 OpenAI除了提供網頁版的chatGPT,還通過api的形式提供了很多其它服務,包括文字糾錯、圖片生成、音頻轉換等等。 作為程式員,即使有現成的openai庫,但還是免不了想自己造輪子,所以就有這個openai庫。 ...
  • "If debugging is the process of removing software bugs, then programming must be the process of putting them in." - Edsger Dijkstra “如果調試是消除軟體Bug的過程,那 ...
  • 教程簡介 Windows通訊開發平臺(Windows Communication Foundation,簡稱WCF)是由微軟開發的一系列支持數據通信的應用程式框架,可以翻譯為Windows通訊開發平臺。 整合了原有的windows通訊的 .net Remoting,WebService,Socket ...
  • ###JWT的簡單使用 ####介紹 當今Web開發中,API的使用越來越廣泛,而API的安全性也變得越來越重要。其中,JWT(JSON Web Token)鑒權和授權是一種常見的解決方案。 本篇文章將會介紹JWT鑒權和授權的原理、實現方式以及註意事項。 ####什麼是JWT? JWT是一種基於JS ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...