.NET中封裝SqlHelper

Foutran發表於2018-05-10
SqlHelper是一個基於.NET Framework的資料庫操作元件,將運算元據庫常用的方法封裝到SqlHelper中,可以提高程式碼編寫效率,減少冗餘程式碼。下面將詳細示例一個自己封裝的SqlHelper,並展示如何使用它。

1、因為連線字串可能會根據不同需求而經常發生改變,所以要在App.config的xml檔案中寫上連線字串。當連線字串發生改變時,無需更改專案中的原始碼,只要更改配置檔案即可。如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>
  <!--以下,是連線字串-->
  <connectionStrings>
    <add  name="mssqlserver" connectionString="Data Source=fuqin-pc;Initial Catalog=PhoneNumManager;Integrated Security=true"/>
  </connectionStrings>
  <!--以上-->
</configuration>

2、建立一個類,命名為SqlHelper

3、封裝SqlHelper。注意:封裝ExecuteReader:因為這個方法涉及到連線池的問題。所以和以上的兩種方法有一定的差別,放一段程式碼。在這裡建立連線物件的時候不能using起來,using被翻譯成try  {  }finally { },在返回cmd.ExecuteReader的時候不能把連線關了,所以不能將SqlConnection conn = new SqlConnection(constr);給using起來。如果部using起來,那每次呼叫這個方法都會有一個物件放在連線池裡面,所以可以在返回的cmd.ExecuteReader裡面寫上一個過載cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);這樣在返回的後關閉reader的同時將conn這個連線物件給關閉。由於建立連線物件的時候沒有using起來,所以在返回的時候可能報異常,因此要將開啟連線和返回這兩條語句給try起來。

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 繫結DataGridView
{
    /// <summary>
    /// 因為SqlHelper不需要建立物件,所以將其設定為靜態類
    /// </summary>
    public static class SqlHelper
    {
        /*
         * 連線字串只需要在類的內部被訪問,且不能隨意更改連線字串的內容,所以將其設為私有的只讀欄位
         * ConfigurationManager類需要新增引用System.Configuration,並匯入名稱空間
         */
        private static readonly string constr = ConfigurationManager.ConnectionStrings["mssqlserver"].ConnectionString;
        /// <summary>
        /// 用來執行增刪改的方法
        /// </summary>
        /// <param name="sql">要傳入的sql語句</param>
        /// <param name="pms">sql語句中的引數</param>
        /// <returns>返回影響的行數</returns>
        public static int ExecuteNonQuery(string sql, params SqlParameter[] pms)
        {
            using (SqlConnection con = new SqlConnection(constr))
            {
                using (SqlCommand cmd = new SqlCommand(sql, con))
                {
                    if (pms != null)
                    {
                        cmd.Parameters.AddRange(pms);
                    }
                    con.Open();
                    return cmd.ExecuteNonQuery();
                }
            }
        }
        /*
         * 用來執行返回單個結果的方法
         */
        public static object ExecuteScalar(string sql, params SqlParameter[] pms)
        {
            using (SqlConnection con = new SqlConnection(constr))
            {
                using (SqlCommand cmd = new SqlCommand(sql, con))
                {
                    if (pms != null)
                    {
                        cmd.Parameters.AddRange(pms);
                    }
                    con.Open();
                    return cmd.ExecuteScalar();
                }
            }
        }
        /*
         * 用來執行返回多行多列的方法
         */
        public static SqlDataReader ExecuteReader(string sql, params SqlParameter[] pms)
        {
            SqlConnection con = new SqlConnection(constr);
            using (SqlCommand cmd = new SqlCommand(sql, con))
            {
                if (pms != null)
                {
                    cmd.Parameters.AddRange(pms);
                }
                try
                {
                    con.Open();
                    /*
                     * System.Data.CommandBehavior.CloseConnection這個列舉引數,表示將來使用完畢SqlDataReader後,在關閉reader的同時,在SqlDataReader內部會將關聯的Connection物件也關閉掉
                     */
                    return cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
                }
                catch
                {
                    con.Close();
                    con.Dispose();
                    throw;
                }
            }
        }
        /*
         * ExecuteAdapter的方法,返回的類是DataTable的型別。
         */
        public static DataTable ExecuteDataTable(string sql, params SqlParameter[] pms)
        {
            DataTable dataTable = new DataTable();
            using (SqlDataAdapter adapter=new SqlDataAdapter(sql,constr))
            {
                if (pms != null) adapter.SelectCommand.Parameters.AddRange(pms);
                adapter.Fill(dataTable);
            }
            return dataTable;
        }
        
    }
}
至此,完成了整個SqlHelper的封裝,類中共封裝了四個常用的方法。




相關文章