關於ADO.NET中的幾大對象的介紹使用的個人心得

這兩天因爲準備企業的筆面試,特地回頭看了一下ADO.NET,發現還是有很多不是很理解的地方,重新再翻過之後,特地把自己所理解的東西寫下來。

關於ADO.NET,有幾個很重要的對象,在這裏只介紹:SqlConnection,SqlCommand,SqlDataAdapter,SqlDataReader,DataSet,DataTable,SqlParameter.

1.SqlConnection,詞義很明顯的告訴咱麼,是用來建立與數據庫的連接的,是應用程序與數據源之間的橋樑,一般情況下用用這種方式來建立連接:

SqlConnection conn = new SqlConnection(connStr)//connStr是數據庫連接字符串
實際上就是實例化一個數據庫連接對象,並且把連接要用上的信息整合成一個一定格式的字符串並且當做參數傳給SQLConnection對象的構造函數。而數據庫連接字符串是個經常要被使用到的字符串變量,所以要對它進行一些處理,要知道連接字符串並不是一成不變的,我們無法在每個需要它的地方去定義它,因爲一旦要進行修改,那麼工作量會很大,我們要讓它在應用程序中能夠被重用,可能首先想到的是可以將連接字符串封裝到一個全局變量中,比如放到一個公有的靜態類中(public static),這樣做的話的確可以在程序的任何地方都能訪問到它,但是有一個不科學的地方就是一旦連接字符串被修改,那麼整個項目都要重新編譯和部署。目前來說較爲常用的方法是將連接字符串寫入到網站的配置文件中,在需要的時候通過ConfigurationManager類來進行調用,代碼如下:

//在配置文件中的配置代碼如下
<connectionStrings>
<add name="connStr" connectionString="server=服務器名稱;database=數據庫名稱;uid=用戶名;password=密碼"/>
<connectionStrings/>

//在後臺通過以下代碼來進行調用:
string connStr = ConfigrationManager.ConnectionStrings["connStr"].ConnectionString;

2.SqlCommand,簡單的說,該對象的作用是負責對數據庫執行所需要的sql命令。該對象的創建有好幾種方法,但是其實都是一樣,我所知的就有是三種:分別是使用帶參的構造函數創建,使用不帶參的構造函數創建,使用SqlConnection對象的createCommand方法,在這裏只介紹一下常用的一種方法,其他方法其實也很簡單。

SqlCommand cmd = new SqlCommand(sql語句,sqlConnection對象);

再介紹該對象的兩個常用的方法:ExecuteScalar(),這個方法返回查詢結果的首行首列的值

   ExecuteReader(),這個方法用來執行返回一個DataReader對象。在這裏就必須要介紹一下DataReader了,它是一個數據讀取器,可以快速的從數據庫中檢索記錄信息,數據讀取器對象使用的是一個活動的數據連接,因此應該快速使用,並且立即將其關閉,實際上這個對象非常簡答, 它只支持快速向前只讀方式來訪問記錄,但是這種方式正式快速檢索所需要的,它的性能比DataSet要好,對於直接數據訪問形式來說,它一般都是首選。並且DataReader的read()方法能快速往下讀取數據,一次讀一行,並且通過字段名取出讀取的那一行的某一列的內容。代碼如下:

SqlDataReader reader = cmd.ExecuteReader();
while(reader.read()){
    string text1 = reader["字段名1"];
    string text2 = reader["字段名2"];
}
//在獲取數據讀取器DataReader之後,也可以用DataTable的load方法裝載讀取器,獲取數據庫查詢出來的全部內容到DataTable中
//這是用DataTable獲取查詢出來的內容的一種很常用的方法
SqlDataReader sdr = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.load(sdr);
3.SqlDataAdapter,也叫數據適配器,它的作用是連接數據源與DataSet數據集,用數據庫中的內容來填充數據集,將數據集中的內容更新到數據庫,而SqlAdapter就是兩者之間的橋樑,需要注意的是,DataSet是將數據源中的所有數據都加載到自己裏面,然後關閉數據連接,這是一種緩存技術,利用空間換取時間,在進行再次或者多次面向相同數據源的查詢時能大大加快查詢速度。代碼如下:

SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.fill(ds,"Authors");//該數據命令在數據集中創建一個名爲Author的新數據表
//如果需要的話,可以不斷的修改cmd的commandText屬性,來多次用適配器進行不同表的填充,因爲DataSet本來就是由一張或者多張數據表(DataTable)組成,而DataTable是由DataColumn,DataRelation,constrain,DataRow對象組成。
4.SqlParameter,用來給參數賦值的一個類,將用法貼出來:

SqlParameter [] paras = new SqlParameter[]{
    new SqlParameter("@parameter(參數名)",參數值),
    new SqlParameter("@parameter(參數名)",參數值),
    ......
};
//將參數添加進參數數組中後,就可以開始執行參數化查詢了
cmd.Parameters.AddRange(paras);
SqlDataReader sdr = cmd.ExecuteReader();

以上只是粗略的介紹幾個對象的常規使用方法,下面貼出我自己的一個數據庫助手類來在實踐中進行理解


namespace DAL
{
    public class SQLhelper
    {
        private SqlConnection conn = null;
        private SqlCommand cmd = null;
        private SqlDataReader sdr = null;
        public SQLhelper() {
            string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
            conn = new SqlConnection(connStr); 
        }
        //只是對外提供訪問連接對象的方法,並沒有將具體實現暴露
        private SqlConnection getConn() {
            if (conn.State == ConnectionState.Closed) {
                conn.Open();
            }
            return conn;
        }
        /// <summary>
        /// 此方法用來執行不帶參數的增刪改SQL語句或者存儲過程
        /// </summary>
        /// <param name="cmdText">SQL語句或者存儲過程的內容</param>
        /// <param name="ct">要執行的內容的類型,屬性值爲Text或者StoreProcedure</param>
        /// <returns>返回數據表中受影響的行數</returns>
        public int ExecuteNonQuery(string cmdText,CommandType ct) {
            int res;
            try
            {
                cmd = new SqlCommand(cmdText, getConn());
                cmd.CommandType = ct;
                res = cmd.ExecuteNonQuery();                                                                                                             
            }
            catch (Exception ex) { throw ex; }
            finally
            {
                if (conn.State == ConnectionState.Open) {
                    conn.Close();
                }
            }
            return res;
        }
        /// <summary>
        /// 此方法用於執行帶參數的增刪改SQL語句或者存儲過程
        /// </summary>
        /// <param name="cmdText">SQL語句或者存儲過程的內容</param>
        /// <param name="ct">類型,Text或者StoreProced</param>
        /// <param name="paras">參數集</param>
        /// <returns>受影響的行數</returns>
        public int ExecuteNonQuery(string cmdText, CommandType ct,SqlParameter[] paras) {
            int res;
            //使用using語句也可以用來釋放資源
            using (cmd = new SqlCommand(cmdText, getConn()))
            {
                cmd.CommandType = ct;
                cmd.Parameters.AddRange(paras);
                res = cmd.ExecuteNonQuery();
            }
            return res;
        }
        /// <summary>
        /// 此方法用於執行不帶參數的SQL查詢語句或者存儲過程
        /// </summary>
        /// <param name="cmdText">語句或者存儲過程名</param>
        /// <param name="ct">類型,Text或者StoreProcedure</param>
        /// <returns>返回一個DataTable</returns>
        public DataTable ExecuteQuery(string cmdText, CommandType ct) {
            DataTable dt = new DataTable();
            cmd = new SqlCommand(cmdText, getConn());
            cmd.CommandType = ct;
            using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
            {
                dt.Load(sdr);
            }
            return dt;
        }
        /// <summary>
        /// 此方法用於執行帶參數的查詢SQL語句或者存儲過程
        /// </summary>
        /// <param name="cmdText">SQL語句名或者存儲過程名</param>
        /// <param name="ct">類型,Text或者StoreProcedure</param>
        /// <param name="paras">參數集</param>
        /// <returns>返回查詢出來的數據的DataTable</returns>
        public DataTable ExecuteQuery(string cmdText, CommandType ct, SqlParameter[] paras) {
            DataTable dt = new DataTable();
            cmd = new SqlCommand(cmdText, getConn());
            cmd.CommandType = ct;
            cmd.Parameters.AddRange(paras);
            using (sdr = cmd.ExecuteReader())
            {
                dt.Load(sdr);
            }
            return dt;
        }
    }
}



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