1. 程式人生 > >C#操作資料庫的常用公共方法!

C#操作資料庫的常用公共方法!

    即便是一個小型的C#+資料庫的專案(本文以SQL SERVER為例,其他資料庫類似),也需要多種對資料庫的操作。有時候編程式碼的時候,想到哪寫到哪確實可以實現具體的功能,但從整個框架體系上來看,程式碼的冗餘以及不規範,很有可能導致程式碼執行的效率,對後期擴充套件專案的規模也是有弊而無利。以前我犯了很都這種錯誤,以後堅決不犯了。

    好了,言歸正傳了。經常操作資料庫的步驟無非就是連線資料庫,執行SQL語句,顯示結果三個大步驟。而一般這三個步驟可以由兩個方面進行(個人感覺是這樣):一個方法就是建立SqlDataAdapter用以填充資料集DataSet;另一個方法就是利用Commd物件執行SQL語句,然後建立SqlDataReader。前者主要用於繫結顯示控制元件,後者則傾向於判斷某種條件。總之,大體的操作流程就是這樣,當我們進行多次操作資料庫的時候,必然會有重複的程式碼,那麼建立公共方法就是很必要的了。

建立一個公共類,如下

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

namespace BaseClass
{
    class BaseOperate
    {

        
        //連線資料庫
        public SqlConnection getcon()
        {
            string M_str_sqlcon = "Server=.;DataBase=db_CRM;Trusted_Connection=SSPI";
            SqlConnection myCon = new SqlConnection(M_str_sqlcon);
            return myCon;
        }
        

       //連線SqlConnection,執行SQL
        public void getcom(string M_str_sqlstr)
        {
            SqlConnection sqlcon = this.getcon();
            sqlcon.Open();
            SqlCommand sqlcom = new SqlCommand(M_str_sqlstr, sqlcon);
            sqlcom.ExecuteNonQuery();
            sqlcom.Dispose();
            sqlcon.Close();
            sqlcon.Dispose();
        }
        

        //建立DataSet物件
        public DataSet getds(string M_str_sqlstr, string M_str_table)
        {
            SqlConnection sqlcon = this.getcon();
            SqlDataAdapter sqlda = new SqlDataAdapter(M_str_sqlstr, sqlcon);
            DataSet myds = new DataSet();
            sqlda.Fill(myds, M_str_table);
            return myds;
        }
        

        //建立SqlDataReader物件
        public SqlDataReader getread(string M_str_sqlstr)
        {
            SqlConnection sqlcon = this.getcon();
            SqlCommand sqlcom = new SqlCommand(M_str_sqlstr, sqlcon);
            sqlcon.Open();
            SqlDataReader sqlread = sqlcom.ExecuteReader(CommandBehavior.CloseConnection);
            return sqlread;
        }
        
    }
}

    將每一個步驟像如上一樣寫成公共方法,則就能隨意的在各個模組進行呼叫,這不僅使得程式碼簡潔明瞭,也有助於旁人閱讀。另外,對變數的命名也需要有自己的命名規則,不然當變數很都得時候就會搞混。

    有了上面的鋪墊,可以按照上面的思路繼續考慮可能用到的公共方法,其中,控制元件(比如下拉框)的資料繫結,正則表示式的判定算是最常用的,乘勝追擊,立刻再寫一個公共類,新增如下公共方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Windows.Forms;
using System.Text.RegularExpressions;





namespace BaseClass
{
   
    class OperateAndValidate
    {
        BaseOperate boperate = new BaseOperate();// 宣告BaseOperate類的一個物件,以呼叫其方法
        //繫結COMBOBOX控制元件
        public void cboxBind(string P_str_sqlstr, string P_str_table, string P_str_tbMember, ComboBox cbox)
        {
            DataSet myds = boperate.getds(P_str_sqlstr, P_str_table);
            cbox.DataSource = myds.Tables[P_str_table];//將資料集中的表繫結到下拉框上
            cbox.DisplayMember = P_str_tbMember;//將表中的具體的列所對應的值顯示在下拉框中
        }
        

        //驗證輸入的字串為數字
        public bool validateNum(string P_str_num)
        {
            return Regex.IsMatch(P_str_num, "^[0-9]*$");
        }
         //驗證輸入的字串為電話號碼
        public bool validatePhone(string P_str_phone)
        {
            return Regex.IsMatch(P_str_phone, @"\d{3,4}-\d{7,8}");
        }
         //驗證輸入的字串為傳真號碼
        public bool validateFax(string P_str_fax)
        {
            return Regex.IsMatch(P_str_fax, @"86-\d{2,3}-\d{7,8}");
        }
        

        //驗證輸入的字串為郵編號碼
        public bool validatePostCode(string P_str_postcode)
        {
            return Regex.IsMatch(P_str_postcode, @"\d{6}");
        }
        #endregion

        //驗證輸入的字串為E-MAIL地址
        public bool validateEmail(string P_str_email)
        {
            return Regex.IsMatch(P_str_email, @"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*");
        }
        

        //驗證輸入的字串為網路地址
        public bool validateNAddress(string P_str_naddress)
        {
            return Regex.IsMatch(P_str_naddress, @"http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?");
        }
        

        //自動編號
        /// <summary>
        /// 自動編號
        /// </summary>
        /// <param name="P_str_sqlstr">SQL語句</param>
        /// <param name="P_str_table">資料表</param>
        /// <param name="P_str_tbColumn">資料表字段</param>
        /// <param name="P_str_codeIndex">編號前的字串</param>
        /// <param name="P_str_codeNum">編號後的數字</param>
        /// <param name="txt">textBox控制元件名</param>
        public void autoNum(string P_str_sqlstr, string P_str_table, string P_str_tbColumn, string P_str_codeIndex, string P_str_codeNum, TextBox txt)
        {
            string P_str_Code = "";
            int P_int_Code = 0;
            DataSet myds = boperate.getds(P_str_sqlstr, P_str_table);
            if (myds.Tables[0].Rows.Count == 0)
            {
                txt.Text = P_str_codeIndex + P_str_codeNum;
            }
            else
            {
                P_str_Code = Convert.ToString(myds.Tables[0].Rows[myds.Tables[0].Rows.Count - 1][P_str_tbColumn]);//獲取最後一行資料裡的編號欄位
                P_int_Code = Convert.ToInt32(P_str_Code.Substring(1, 3)) + 1;//我的欄位為"C101,C102....."
                P_str_Code = P_str_codeIndex + P_int_Code.ToString();
                txt.Text = P_str_Code;
            }
        }
        

       }
}


在自動編號的公共方法裡,提取字串的格式各有不同,由於不知道有什麼方法可以實現自增,只能用C101來進行自增(要是設定為C001要的話,按照上述方法,第二個就是C2了),這方法也就將就著能用吧。