【ASP.NET開發】ASP.NET對SQLServer的通用資料庫訪問類

zhiqiang21發表於2012-09-20

怎麼說呢,作為程式設計師,我們明天都應該學習新的知識。

以前我在對資料庫進行操作的時候都是在同一頁面對資料庫進行操作。這樣的話,就是操作繁瑣,而且需要重複的書寫對資料庫操作的程式碼,這樣不僅浪費了很多的時間,而且也使得程式碼看起來非常的凌亂。至從接觸到了三層架構的思想,明白了分層的好處,還有物件導向的好處。今天在看書的時候,看到周金橋老師的對資料庫訪問的通用類,就試著模仿的寫了一個,程式碼清晰,而且很實用,包括了對資料庫的所有的常用的操作。

/// <summary>
    /// 資料庫訪問通用類
    /// </summary>
    public class SqlHelper
    {
        private string connectionString;

        /// <summary>
        /// 設定資料庫訪問字串
        /// </summary>
        public string ConnectionString
        {
            
            set { connectionString = value; }
        }

        /// <summary>
        /// 建構函式
        /// </summary>
        /// <param name="connectionString">資料庫訪問字串</param>
        public SqlHelper(string connectionString)
        {
            this.connectionString = connectionString;
        }

        /// <summary>
        /// 執行一個查詢,並返回查詢結果
        /// </summary>
        /// <param name="sql">要執行的sql語句</param>
        /// <param name="commandType">要執行的查詢語句的型別,如儲存過程或者sql文字命令</param>
        /// <returns>返回查詢結果集</returns>
        public DataTable ExecuteDataTable(string sql,CommandType commandType)
        {
            return ExecuteDataTable(sql, commandType, null);
        }

        /// <summary>
        /// 執行一個查詢,並返回結果集
        /// </summary>
        /// <param name="sql">要執行的sql文字命令</param>
        /// <returns>返回查詢的結果集</returns>
        public DataTable ExecuteDataTable(string sql)
        {
            return ExecuteDataTable(sql, CommandType.Text, null);
        }


        /// <summary>
        /// 執行一個查詢,並返回查詢結果
        /// </summary>
        /// <param name="sql">要執行的sql語句</param>
        /// <param name="commandtype">要執行查詢語句的型別,如儲存過程或者sql文字命令</param>
        /// <param name="parameters">Transact-SQL語句或者儲存過程引數陣列</param>
        /// <returns></returns>
        public DataTable ExecuteDataTable(string sql, CommandType commandtype, SqlParameter[] parameters)
        {
            DataTable data = new DataTable(); //例項化datatable,用於裝載查詢結果集
            using (SqlConnection con = new SqlConnection(connectionString))
            {
                using (SqlCommand cmd = new SqlCommand(sql, con))
                {
                    cmd.CommandType = commandtype;//設定command的commandType為指定的Commandtype
                    //如果同時傳入了引數,則新增這些引數
                    if (parameters != null)
                    {
                        foreach (SqlParameter parameter in parameters)
                        {
                            cmd.Parameters.Add(parameter);
                        }
                    }

                    //通過包含查詢sql的sqlcommand例項來例項化sqldataadapter
                    SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                    adapter.Fill(data);//填充datatable

                }
            }
            return data;
        }

        /// <summary>
        /// 返回一個SqlDataReader物件的例項
        /// </summary>
        /// <param name="sql">要執行的SQl查詢命令</param>
        /// <returns></returns>
        public SqlDataReader ExecuteReader(string sql)
        {
            return ExecuteReader(sql, CommandType.Text, null);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sql">要執行的sql語句</param>
        /// <param name="commandType">要執行查詢語句的型別,如儲存過程或者SQl文字命令</param>
        /// <returns></returns>
        public SqlDataReader ExecuteReader(string sql,CommandType commandType)
        {
            return ExecuteReader(sql, commandType, null);
        }

        /// <summary>
        /// 返回一個sqldatareader物件的例項
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="commandType"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public SqlDataReader ExecuteReader(string sql, CommandType commandType, SqlParameter[] parameters)
        {
            SqlConnection con = new SqlConnection(connectionString);
            SqlCommand cmd = new SqlCommand(sql, con);

            if (parameters != null)
            {
                foreach (SqlParameter parameter in parameters)
                {
                    cmd.Parameters.Add(parameters);
                }
            }
            con.Open();
            //CommandBehavior.CloseConnection引數指示關閉reader物件時關閉與其關聯的Connection物件
            return cmd.ExecuteReader(CommandBehavior.CloseConnection);
        }

        /// <summary>
        /// 執行一個查詢,返回結果集的首行首列。忽略其他行,其他列
        /// </summary>
        /// <param name="sql">要執行的SQl命令</param>
        /// <returns></returns>
        public Object ExecuteScalar(string sql)
        {
            return ExecuteScalar(sql, CommandType.Text, null);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="commandType"></param>
        /// <returns></returns>
        public Object ExecuteScalar(string sql, CommandType commandType)
        {
            return ExecuteScalar(sql, commandType, null);
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="commandType">引數型別</param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public Object ExecuteScalar(string sql,CommandType commandType, SqlParameter[] parameters)
        {
            Object result=null;
            SqlConnection con=new SqlConnection(connectionString);
            SqlCommand cmd=new SqlCommand(sql,con);
            cmd.CommandType= commandType;
            if(parameters!=null)
            {
                foreach (SqlParameter parapmeter in parameters)
                {
                    cmd.Parameters.Add(parapmeter);
                }
            }

            con.Open();
            result=cmd.ExecuteScalar();
            con.Close();
            return result;
        }

        /// <summary>
        /// 對資料庫進行增刪改的操作
        /// </summary>
        /// <param name="sql">要執行的sql命令</param>
        /// <returns></returns>
        public int ExecuteNonQuery(string sql)
        {
            return ExecuteNonQuery(sql, CommandType.Text, null);
        }

        /// <summary>
        /// 資料庫進行增刪改的操作
        /// </summary>
        /// <param name="sql">對資料庫進行操作的sql命令</param>
        /// <param name="commandType">要執行查詢語句的型別,如儲存過程或者sql文字命令</param>
        /// <returns></returns>
        public int ExecuteNonQuery(string sql, CommandType commandType)
        {
            return ExecuteNonQuery(sql, commandType, null);
        }

        /// <summary>
        /// 對資料庫進行增刪改的操作
        /// </summary>
        /// <param name="sql">要執行的sql語句</param>
        /// <param name="commandType">要執行的查詢語句型別,如儲存過程或者sql文字命令</param>
        /// <param name="parameters">Transact-SQL語句或者儲存過程的引數陣列</param>
        /// <returns></returns>
        public int ExecuteNonQuery(string sql, CommandType commandType, SqlParameter[] parameters)
        {
            int count = 0;
            SqlConnection con = new SqlConnection(connectionString);
            SqlCommand cmd = new SqlCommand(sql, con);
            cmd.CommandType = commandType;
            if (parameters != null)
            {
                foreach(SqlParameter parameter in parameters)
                {
                    cmd.Parameters.Add(parameter);
                }
            }

            con.Open();
            count = cmd.ExecuteNonQuery();
            con.Close();
            return count;
        }

        /// <summary>
        /// 返回當前連線的資料庫中所有使用者建立的資料庫
        /// </summary>
        /// <returns></returns>
        public DataTable GetTables()
        {
            DataTable table = null;
            using (SqlConnection con = new SqlConnection(connectionString))
            {
                con.Open();
                table = con.GetSchema("Tables");

            }
            return table;
        }
    }

如果我們建立了一個對資料庫訪問的通用類以後,在隨資料庫進行操作的時候嗎,就只需要先例項化物件,然後根據自己的需要,呼叫相應的方法就可以完成對資料庫的所有操作。這就是資料庫訪問層和業務邏輯層分開的好處。

這樣書寫的程式碼,可以大大的減少我們程式碼的複雜度。而且,繁瑣度也大大的降低了。


相關文章