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

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

我定義了一系列靜態方法,用於執行SQL Server資料庫的增刪改查等操作。其中:ExecuteNonQuery方法用於執行指定的SQL語句並返回受影響的行數;ExecuteScalar方法用於執行指定的SQL語句並返回查詢結果的第一行第一列;ExecuteDataTable方法用於執行指定的SQL ...


我定義了一系列靜態方法,用於執行SQL Server資料庫的增刪改查等操作。
其中:
ExecuteNonQuery方法用於執行指定的SQL語句並返回受影響的行數;
ExecuteScalar方法用於執行指定的SQL語句並返回查詢結果的第一行第一列;
ExecuteDataTable方法用於執行指定的SQL語句並返回一個數據表;
ExecuteReader方法用於執行指定的SQL語句並返回一個DataReader對象。
Insert方法用於向指定的表中插入一條記錄,並返回新記錄的ID值(如果有自增欄位);
Update方法用於更新指定表中滿足條件的記錄,並返回受影響的行數;
Delete方法用於刪除指定表中滿足條件的記錄,並返回受影響的行數。
在這些方法中,我們使用了ADO.NET的相關技術,包括SqlConnection、SqlCommand、SqlDataAdapter、DataSet等類,以及SqlParameter對象來

一、下麵是一套SQL Server的幫助類,包括增刪改查等操作,並且帶有詳細註釋。

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;

public class SqlserverHelper
{
    private static string connectionString = "Data Source=伺服器名稱;Initial Catalog=資料庫名稱;User ID=用戶名;Password=密碼";  // 資料庫連接字元串

    /// <summary>
    /// 執行指定的SQL語句並返回受影響的行數
    /// </summary>
    /// <param name="sql">要執行的SQL語句</param>
    /// <returns>受影響的行數</returns>
    public static int ExecuteNonQuery(string sql)
    {
        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            conn.Open();          // 打開資料庫連接
            SqlCommand cmd = new SqlCommand(sql, conn);
            int count = cmd.ExecuteNonQuery();   // 執行SQL語句並返回受影響的行數
            return count;         // 返回受影響的行數
        }
    }

    /// <summary>
    /// 執行指定的SQL語句並返回查詢結果的第一行第一列
    /// </summary>
    /// <param name="sql">要執行的SQL語句</param>
    /// <returns>查詢結果的第一行第一列</returns>
    public static object ExecuteScalar(string sql)
    {
        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            conn.Open();          // 打開資料庫連接
            SqlCommand cmd = new SqlCommand(sql, conn);
            object obj = cmd.ExecuteScalar();   // 執行SQL語句並返回查詢結果的第一行第一列
            return obj;           // 返回查詢結果的第一行第一列
        }
    }

    /// <summary>
    /// 執行指定的SQL語句並返回一個數據表
    /// </summary>
    /// <param name="sql">要執行的SQL語句</param>
    /// <returns>查詢結果的數據表</returns>
    public static DataTable ExecuteDataTable(string sql)
    {
        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            conn.Open();          // 打開資料庫連接
            SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
            DataSet ds = new DataSet();
            adapter.Fill(ds);     // 執行SQL語句並將查詢結果填充到DataSet對象中
            return ds.Tables[0];  // 返回查詢結果的數據表
        }
    }

    /// <summary>
    /// 執行指定的SQL語句並返回一個DataReader對象
    /// </summary>
    /// <param name="sql">要執行的SQL語句</param>
    /// <returns>查詢結果的DataReader對象</returns>
    public static SqlDataReader ExecuteReader(string sql)
    {
        SqlConnection conn = new SqlConnection(connectionString);
        conn.Open();              // 打開資料庫連接
        SqlCommand cmd = new SqlCommand(sql, conn);
        SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);   // 執行SQL語句並返回DataReader對象
        return reader;            // 返回查詢結果的DataReader對象
    }

    /// <summary>
    /// 向指定的表中插入一條記錄,並返回新記錄的ID值(如果有自增欄位)
    /// </summary>
    /// <param name="tableName">要插入記錄的表名稱</param>
    /// <param name="fields">要插入記錄的欄位和值的集合</param>
    /// <returns>新記錄的ID值(如果有自增欄位)</returns>
    public static int Insert(string tableName, Dictionary<string, object> fields)
    {
        string sql = "insert into " + tableName + "(";
        string values = ") values (";
        SqlCommand cmd = new SqlCommand();
        foreach (KeyValuePair<string, object> field in fields)
        {
            sql += "[" + field.Key + "],";
            values += "@" + field.Key + ",";
            cmd.Parameters.AddWithValue("@" + field.Key, field.Value);
        }
        sql = sql.TrimEnd(',') + values.TrimEnd(',') + ")";
        sql += ";select @@identity";    // 如果有自增欄位,則返回新記錄的ID值
        cmd.Connection = new SqlConnection(connectionString);
        cmd.CommandText = sql;
        cmd.Connection.Open();     // 打開資料庫連接
        int newId;
        if (cmd.ExecuteScalar() != DBNull.Value)
        {
            newId = Convert.ToInt32(cmd.ExecuteScalar());
        }
        else
        {
            newId = 0;   // 如果沒有自增欄位,則返回0
        }
        cmd.Connection.Close();    // 關閉資料庫連接
        return newId;              // 返回新記錄的ID值
    }

    /// <summary>
    /// 更新指定表中滿足條件的記錄,並返回受影響的行數
    /// </summary>
    /// <param name="tableName">要更新記錄的表名稱</param>
    /// <param name="fields">要更新的欄位和值的集合</param>
    /// <param name="conditions">更新條件的欄位和值的集合</param>
    /// <returns>受影響的行數</returns>
    public static int Update(string tableName, Dictionary<string, object> fields, Dictionary<string, object> conditions)
    {
        string sql = "update " + tableName + " set ";
        SqlCommand cmd = new SqlCommand();
        foreach (KeyValuePair<string, object> field in fields)
        {
            sql += "[" + field.Key + "]=@" + field.Key + ",";
            cmd.Parameters.AddWithValue("@" + field.Key, field.Value);
        }
        sql = sql.TrimEnd(',');
        if (conditions != null && conditions.Count > 0)
        {
            sql += " where ";
            foreach (KeyValuePair<string, object> condition in conditions)
            {
                sql += "[" + condition.Key + "]=@" + condition.Key + " and ";
                cmd.Parameters.AddWithValue("@" + condition.Key, condition.Value);
            }
            sql = sql.TrimEnd(' ', 'a', 'n', 'd');
        }
        cmd.Connection = new SqlConnection(connectionString);
        cmd.CommandText = sql;
        cmd.Connection.Open();     // 打開資料庫連接
        int count = cmd.ExecuteNonQuery();   // 執行SQL語句並返回受影響的行數
        cmd.Connection.Close();    // 關閉資料庫連接
        return count;              // 返回受影響的行數
    }

    /// <summary>
    /// 刪除指定表中滿足條件的記錄,並返回受影響的行數
    /// </summary>
    /// <param name="tableName">要刪除記錄的表名稱</param>
    /// <param name="conditions">刪除條件的欄位和值的集合</param>
    /// <returns>受影響的行數</returns>
    public static int Delete(string tableName, Dictionary<string, object> conditions)
    {
        string sql = "delete from " + tableName;
        SqlCommand cmd = new SqlCommand();
        if (conditions != null && conditions.Count > 0)
        {
            sql += " where ";
            foreach (KeyValuePair<string, object> condition in conditions)
            {
                sql += "[" + condition.Key + "]=@" + condition.Key + " and ";
                cmd.Parameters.AddWithValue("@" + condition.Key, condition.Value);
            }
            sql = sql.TrimEnd(' ', 'a', 'n', 'd');
        }
        cmd.Connection = new SqlConnection(connectionString);
        cmd.CommandText = sql;
        cmd.Connection.Open();     // 打開資料庫連接
        int count = cmd.ExecuteNonQuery();   // 執行SQL語句並返回受影響的行數
        cmd.Connection.Close();    // 關閉資料庫連接
        return count;              // 返回受影響的行數
    }
}
View Code

二、每一個方法的調用。

在這個示例中,我首先調用ExecuteNonQuery方法向資料庫中插入一條記錄,並輸出插入的行數;
然後調用ExecuteScalar方法查詢了資料庫中記錄的總數,並輸出結果;
接下來,我使用ExecuteDataTable方法查詢了符合條件的記錄,並通過遍曆數據表的方式輸出所有記錄的信息。
然後使用ExecuteReader方法查詢了所有的記錄,並通過遍歷DataReader對象的方式輸出所有記錄的信息。
請註意,在使用完DataReader對象後必須調用其Close()方法關閉它。
接著使用Insert方法向資料庫中插入了一條記錄,並獲得了新記錄的ID值(如果有自增欄位);
還使用Update方法更新了符合條件的記錄,並輸出了更新的行數;
最後,使用Delete方法刪除了符合條件的記錄,並輸出了刪除的行數。
當然,這些示例只是演示瞭如何使用SqlHelper類中的每一個方法。
在實際應用中,將根據具體的需求來調用它們並處理查詢結果。

    static void Main(string[] args)
        {
            // 執行指定的SQL語句並返回受影響的行數
            int count = SqlserverHelper.ExecuteNonQuery("insert into [User](UserName, Password) values('admin', '123456')");
            Console.WriteLine("受影響的行數:" + count);

            // 執行指定的SQL語句並返回查詢結果的第一行第一列
            object obj = SqlserverHelper.ExecuteScalar("select count(*) from [User]");
            Console.WriteLine("記錄總數:" + obj);

            // 執行指定的SQL語句並返回一個數據表
            DataTable dt = SqlserverHelper.ExecuteDataTable("select * from [User] where UserName='admin'");
            foreach (DataRow row in dt.Rows)
            {
                Console.WriteLine("用戶名:" + row["UserName"] + " 密碼:" + row["Password"]);
            }

            // 執行指定的SQL語句並返回一個DataReader對象
            SqlDataReader reader = SqlserverHelper.ExecuteReader("select * from [User]");
            while (reader.Read())
            {
                Console.WriteLine("用戶名:" + reader["UserName"] + " 密碼:" + reader["Password"]);
            }
            reader.Close();

            // 向指定的表中插入一條記錄,並返回新記錄的ID值(如果有自增欄位)
            Dictionary<string, object> fields = new Dictionary<string, object>();
            fields.Add("UserName", "test");
            fields.Add("Password", "123456");
            int newId = SqlserverHelper.Insert("User", fields);
            Console.WriteLine("新記錄的ID值:" + newId);

            // 更新指定表中滿足條件的記錄,並返回受影響的行數
            Dictionary<string, object> conditions = new Dictionary<string, object>();
            conditions.Add("UserName", "test");
            Dictionary<string, object> newFields = new Dictionary<string, object>();
            newFields.Add("Password", "654321");
            int updateCount = SqlserverHelper.Update("User", newFields, conditions);
            Console.WriteLine("更新記錄的數量:" + updateCount);

            // 刪除指定表中滿足條件的記錄,並返回受影響的行數
            Dictionary<string, object> delConditions = new Dictionary<string, object>();
            delConditions.Add("UserName", "test");
            int delCount = SqlserverHelper.Delete("User", delConditions);
            Console.WriteLine("刪除記錄的數量:" + delCount);

            Console.ReadKey();
        }
View Code

 


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

-Advertisement-
Play Games
更多相關文章
  • 用過ASP.NET Core MVC中IActionFilter攔截器的開發人員,都知道這是一個非常強大的MVC攔截器。最近才發現IActionFilter的OnActionExecuting方法,甚至可以獲取Controller的Action方法參數值。 假如我們在ASP.NET Core MVC ...
  • 平臺 windows 需 求 由於我近期有一個比賽,而我的主機又是x86架構的,人家要求使用arm架構的主機,我這窮屌絲,不可 能去買一臺吧,而且隨著國產系統的推進,採用arm架構的主機也越來越多,作為運維我們該怎麼利用x86 來運行arm架構的主機成為了一個問題 需 要的軟體和程式 以下軟體版本皆 ...
  • ansible分離部署LNMP 環境說明: | 系統 | 主機名 | IP | 服務 | | | | | | | centos8 | ansible | 192.168.111.141 | ansible主控機 | | centos8 | nginx | 192.168.111.142 | ngin ...
  • ​根據2022年的DevOps全球調查報告顯示,主流軟體企業採用或部分採用DevOps且已獲得良好成效的占比已達70%,DevOps儼然成為當下軟體開發研究的重要方向。 測試作為軟體開發的必要過程,是提升軟體可靠性、保證軟體質量的關鍵環節。然而,從過往研究文獻來看,希望通過DevOps提升軟體交付效 ...
  • 在這裡分享項目中我經常使用的一種串口收發方式:阻塞發送 + 接收中斷 +空閑中斷 + 環形隊列 項目代碼地址:https://gitee.com/Mokun_gitee/stm32_hal_study.git 一、簡介 串口發送使用最簡單的阻塞發送方式,一般來說都是接收的數據量比較大,發送數據用此方 ...
  • 我學習的過程中,對於連接池和數據源分得不是很清楚,而且我發現有的人將資料庫等同於數據源,或者將數據源等同於連接池,實際上這些說法並不准確。 ...
  • 功能02-商鋪查詢緩存03 3.功能02-商鋪查詢緩存 3.6封裝redis工具類 3.6.1需求說明 基於StringRedisTemplate封裝一個工具列,滿足下列需求: 方法1:將任意Java對象序列化為json,並存儲在string類型的key中,並且可以設置TTL過期時間 方法2:將任意 ...
  • 摘要:如果你需要一款穩定可靠的高性能企業級KV資料庫,不妨試試GaussDB(for Redis)。 每當網路上爆出熱點新聞,混跡於各個社交媒體的小伙伴們全都開啟了討論模式。一條消息的產生是如何在群聊中傳遞的呢?讓我們一起來探索即時通訊系統(IM)的原理。 IM系統架構的原理 當你在群聊“相親相愛一 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...