C#可視化三:DBHelper類和靜態方法

知識點一:DBHelper

爲什麼要對操作數據庫代碼進行封裝?
1,在實際的開發過程中在一個頁面上會有很多不同的功能,如果每一個功能都需要操作數據庫修改數據,按照在C#中使用AOD.NET框架操作數據庫的流程,對應每一個功能都需要寫一套:創建連接--創建Command對象--調用Command對象對應方法--關閉連接;比如新增記錄和刪除記錄就要按照這個流程寫兩遍,而這2遍的代碼唯一不同的地方就是執行的sql語句不同;
複製粘貼雖然好用,但是不高效,不夠靈活;比如說數據庫的連接字符需要修改(比如說數據庫連接的密碼修改了),對應每一個進行數據庫操作創建數據庫連接對象的代碼都要去修改;
2,在開發過程中針對這種重複代碼的情況,可以考慮的就是封裝(就是將重複的代碼寫在方法中:比如增,刪,改這樣的操作,入參就是要執行的代碼,返回值就是操作是否成功)
3,對於數據庫相關的操作已經有一套比較通用的封裝,就是DBHelper類,那麼DBHelper是如何進行封裝的,下面將進行詳細介紹。

將DBHelper的封裝分解爲四步:

DBHelper1
創建DBHelper1類,將數據庫操作用方法進行封裝;通過實例化DBHelper類,使用 對象名.方法 的形式進行調用
知識點:類的實例化,對象方法的外部調用

DBHelper2
能夠接收指定的sql命令,改造增,刪,查方法,爲有參方法,能夠接收指定的sql命令並運行
知識點:有參方法

DBHelper3
在DBHelper2中每一個數據庫操作方法都會聲明,實例化Connection對象,將Connection對象從局部變量改爲全局變量
知識點:
一、全局變量
類的成員包括:字段,方法;類的字段有叫做全局變量
字段的初始化:實例化類的時候類的字段會初始爲該類型的默認值

類成員的兩種訪問方式:內部訪問和外部訪問
內部訪問:類的成員包括:字段和方法;類的成員(這裏指類的方法)可以直接通過本類中其他成員(類的字段)的名稱直接訪問其他成員
外部訪問:從類的外部訪問實例成員:必須包括 變量名稱和成員名稱,並且變量名稱和成員名稱之間用(.)號進行分隔

二、本地變量/局部變量(定義在方法中)
在方法體中聲明,使用
作用範圍:在創建本地代碼的塊中,也就是{}中;
生命週期:被聲明的開始,代碼塊中的代碼執行完之後結束(演示:加法)

DBHelper4
在DBHelper1-3中調用方法都是通過類的實例化,對象名.方法名的形式創建;
那麼可不可以用類似 Consoles.WriteLine()這樣 類名.方法名 的方式去調用DBHelper中的方法呢?
答案是可以的,單從寫代碼的角度看,少寫了一行實例化類的代碼;
知識點:類的靜態成員

DBHelper代碼:

class DBHelper
{
    public static string ConnString = "server=SQL Server服務實例名; database=數據庫名;Integrated Security=true"; //Windows身份驗證
    static SqlConnection Conn = null;

    static void InitConnection()
    {
        if (Conn == null)
        {
            Conn = new SqlConnection(ConnString);
        }
        //判斷連接對象是否關閉,如果關閉,只需要重新打開連接
        if (Conn.State == ConnectionState.Closed)
        {
            Conn.Open();
        }
        //連接中斷,重啓連接
        if (Conn.State == ConnectionState.Broken)
        {
            Conn.Close();
            Conn.Open();
        }
    }

    /// <summary>
    ///增,刪,改
    /// </summary>
    /// <param name="sqlStr">沒有結果集返回的sql命令</param>
    /// <returns>true=表示操作成功</returns>
    public static bool ExcuteNonQuery(string sqlStr)
    {
        //建立連接
        InitConnection();
        //創建命令對象
        SqlCommand command = new SqlCommand(sqlStr,Conn);
        int count = command.ExecuteNonQuery(); //命令收影響行數
        Conn.Close();
        return count > 0;
    }

    /// <summary>
    /// 返回數據讀取對象
    /// </summary>
    /// <param name="sqlStr">需要返回結果集的sql命令</param>
    /// <returns>DataReader對象</returns>
    public static SqlDataReader GetDataReader(String sqlStr)
    {
        //建立連接
        InitConnection();
        SqlCommand command = new SqlCommand(sqlStr,Conn);
        //return command.ExecuteReader();
        return command.ExecuteReader(CommandBehavior.CloseConnection); //數據讀取完成後關閉連接
    }

    /// <summary>
    /// 查詢結果集的第一行第一列
    /// </summary>
    /// <param name="sqlStr">只需要結果集的第一行第一列的sql(通常爲帶聚合函數的sql)</param>
    /// <returns>結果集的第一行第一列</returns>
    public static object ExcuteScalar(string sqlStr)
    {
        //建立連接
        InitConnection();
        SqlCommand command = new SqlCommand(sqlStr,Conn);
        object obj = command.ExecuteScalar();
        Conn.Close();
        return obj;
    }
}

 

知識點二:類的靜態成員

類成員:字段,屬性,方法
類靜態成員:靜態字段,靜態屬性,靜態方法;使用 static 關鍵字修飾類的成員,類的成員就變成了靜態成員

舉例:
實例字段(沒有用static修飾的字段)可以理解爲籃球隊員(對象)每個人都有自己的籃球(字段),自己的籃球漏氣了,不影響其他人的籃球
靜態字段(使用static修飾的字段)理解爲籃球隊員(對象)在訓練的時候使用一個籃球(靜態字段),籃球漏氣了意味着所有隊員在打的籃球(此刻籃球場上就只有一個籃球,共享的概念)都漏氣

靜態字段
使用關鍵字 static修飾
類的內部直接使用 字段名 訪問;類的外部使用 類名.字段名 訪問
修改後應影響的同一個類實例化的所有對象

靜態方法
使用關鍵字 static修飾
類的內部直接使用 方法名 訪問;類的外部使用 類名.方法名 訪問
只能夠訪問靜態成員:就是在方法體中,也就是{},中只能夠訪問靜態字段和靜態方法

語法:

class 類名
{
    [訪問控制符] static 類型 字段名;
    [訪問控制符] static 返回值類型 方法名(參數列表)
    {
        //方法體
    }
}


代碼演示:
1,Pet 舉例:靜態字段的訪問;指向相同內存的概念
實例字段

class Pet
{
    public string name;
    public string color;

    public void PrintInfo()
    {
        Console.WriteLine("name " + name + " color " + color);
    }
}
class Program
{
    static void Main(string[] args)
    {
        Pet daBai = new Pet();
        daBai.name = "大白";
        daBai.color = "白色";
        Pet wuGui = new Pet();
        wuGui.name = "烏龜"; //其實烏龜是隻汪
        wuGui.color = "烏黑";
        //Console.WriteLine("name " + daBai.name + " color " + daBai.name); //變量名.字段名 訪問類的字段
        //Console.WriteLine("name " + wuGui.name + " color " + wuGui.name);
        daBai.PrintInfo();
        wuGui.PrintInfo();
    }
}

靜態字段

class Pet
{
    public string name;
    public static string color;

    public void SetColor(string inputColor)
    {
        color = inputColor;
    }

    public void PrintInfo()
    {
        Console.WriteLine("name " + name + " color " + color);
    }
}
class Program
{
    static void Main(string[] args)
    {
        Pet daBai = new Pet();
        daBai.name = "大白";
        daBai.SetColor("白色");
        Pet wuGUi = new Pet();
        wuGUi.name = "烏龜";
        wuGUi.SetColor("烏黑");
        daBai.PrintInfo();
        wuGUi.PrintInfo();
    }
}

2,MathCustom 舉例:靜態方法,靜態方法塊中訪問類的成員,那麼類的成員必須被定義爲靜態的


歸納:
不管是靜態字段還是靜態方法在類加載的時候都會在內存中開闢一段空間,這個空間存放在靜態字段,靜態方法
通過類實例化出來的對象在內存中都是獨立的,將類中的某個字段聲明爲靜態的,那麼該類下所有的對象的該字段的值都是指向同一內存;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章