久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

[轉(zhuǎn)帖]ADO.net中適配器DataAdapter的說明

 空城66 2015-01-07

對于剛剛學(xué)習(xí)ADO.NET數(shù)據(jù)訪問技術(shù)的來說,,DataAdapter也許往往會令他們感到迷惑,,特別是習(xí)慣于利用托拽DataAdapter控件進行開發(fā)的朋友,通過這一ADO.NET數(shù)據(jù)訪問控件,,我們甚至不用書寫一行代碼,,就能完成各種需要的數(shù)據(jù)訪問和操作,然而在享受快捷便利的同時,,心中卻總掛著一絲意猶未盡的感覺,。DataAdapter控件在背后為我們做了怎樣的工作?弄清楚這一點,,對于喜歡探根究底的朋友,,不僅樂哉悠哉,也有利于我們更它的理解ADO.NET的數(shù)據(jù)訪問機制,;同時對于.NET為我們生成的有關(guān)數(shù)據(jù)訪問的一大堆莫名其妙的代碼,,其中很多我們可能是用不到的,因此實在是感覺不爽,,盡管在Visual2005下.NET已經(jīng)利用局部類的機制將這些代碼很好的隱藏了起來,。

  在本篇文章中,我將自己手動寫代碼完成利用DataAdapter進行數(shù)據(jù)訪問操作,,以便能讓初學(xué)DataAdapter的朋友明白它背后運行的一些情況,。在此,我以SqlServer2005Express數(shù)據(jù)庫作為數(shù)據(jù)源服務(wù)器,,因此需要用到的是SqlDataAdapter數(shù)據(jù)訪問對象,,對于其它的OleDbDataAdapter等對象與此是類似的,也希望這篇文章對于初學(xué)者能起到拋磚引玉的微薄作用吧,。首先在SqlServer2005Express里建立數(shù)據(jù)庫作為數(shù)據(jù)源,,關(guān)于此過程的實現(xiàn)可以通過數(shù)據(jù)定義語句或直接利用可視化界面來完成。我們將通過dataGridView控件來顯示數(shù)據(jù),,詳細的代碼如下所示:

public partial class Form3 : Form

    {

        private SqlConnection myCon;

        private SqlDataAdapter myAda;

        private SqlCommand myCmd;

        private SqlCommandBuilder myCbd;

        private DataSet mySet;

        public Form3()

        {

            InitializeComponent();

            myCon = new SqlConnection("Data Source=localhost\\SQLEXPRESS;Initial Catalog=Shop;Persist Security Info=True;User ID=sa;Password= ");

            myAda = new SqlDataAdapter();

            myCmd = new SqlCommand("select * from Userinfo",myCon);

            myAda.SelectCommand = myCmd;

            myCbd = new SqlCommandBuilder(myAda);

            mySet = new DataSet();

            myAda.TableMappings.Add("UserInfo", "UserInfo");

            myAda.TableMappings[0].ColumnMappings.Add("UserID", "用戶");

            myAda.TableMappings[0].ColumnMappings.Add("UserName", "用戶姓名");

            myAda.TableMappings[0].ColumnMappings.Add("UserAge", "年齡");

            myAda.TableMappings[0].ColumnMappings.Add("UserSex", "性別");

            myAda.TableMappings[0].ColumnMappings.Add("UserAddress", "地址");

        }

        private void Form3_Load(object sender, EventArgs e)

        {

            try

            {

                myAda.Fill(mySet, "UserInfo");

            }

            catch (SqlException ex)

            {

                MessageBox.Show(ex.ToString());

            }

            finally

            {

                myCon.Close();

            }

            dataGridView1.DataSource = mySet.Tables["UserInfo"];

        }

        private void bt_Update_Click(object sender, EventArgs e)

        {

            try

            {

               //將更改的數(shù)據(jù)更新到數(shù)據(jù)表里

                myAda.Update(mySet.Tables[0].GetChanges());

                MessageBox.Show("數(shù)據(jù)更新成功,!");

               //DataTable接受更改,以便為下一次更改作準備

                mySet.Tables[0].AcceptChanges();

            }

            catch (SqlException ex)

            {

                ex.ToString();

            }

        }

        private void bt_Delete_Click(object sender, EventArgs e)

        {

            //從DataTable中刪除當前選中的行

mySet.Tables[0].Rows[dataGridView1.CurrentRow.Index].Delete();

            if (MessageBox.Show("確定要刪除當前行數(shù)據(jù)?", "", MessageBoxButtons.OKCancel) == DialogResult.OK)

            {

                try

                {

                    //將更改的數(shù)據(jù)更新到數(shù)據(jù)表里

                    myAda.Update(mySet.Tables[0].GetChanges());

                    MessageBox.Show("數(shù)據(jù)刪除成功,!");

                    //DataTable接受更改,以便為下一次更改作準備

                    mySet.Tables[0].AcceptChanges();

                }

                catch (SqlException ex)

                {

                    MessageBox.Show(ex.ToString());

                }

            }

            else

            {

               //取消對DataTable的更改

                mySet.Tables[0].RejectChanges();

            }

        }

    }

Ok了,,上面的代碼已經(jīng)能夠完成對數(shù)據(jù)庫更新和刪除的操作,是不是也很簡潔,自己寫的才叫親切,,才叫熟悉,。下面來分析一下。

private SqlConnection myCon;

private SqlDataAdapter myAda;

private SqlCommand myCmd;

private SqlCommandBuilder myCbd;

private DataSet mySet;

看看這幾句,,這是干什么的,,聲明了幾個引用類型的變量,讓它們引用什么???看一下變量類型的名字就很一目了然,像myCon是個SqlConnection類型,,因此肯定是用來引用一個連接類型的,,只是到此時此刻它們還未真正的引用任何東西罷了,就如母親孕育的孩子,,呵呵,還未出世,,親朋好友聚到一起,,都為這事高興,先把名字給起好了,。接著往下走,,

myCon = new SqlConnection("Data Source=localhost\\SQLEXPRESS;Initial Catalog=Shop;Persist Security Info=True;User ID=sa;Password= ");

myAda = new SqlDataAdapter();

myCmd = new SqlCommand("select * from Userinfo",myCon);

myAda.SelectCommand = myCmd;

myCbd = new SqlCommandBuilder(myAda);

mySet = new DataSet();

這幾句這么一寫,你的功勞可就大了,,前面聲明的那幾個變量所引用的物件現(xiàn)在已經(jīng)誕生了,,像出世的孩子它們從這一刻起有了寶貴的生命。其實呢,,通過工具箱拖控件的舉動基本上可以由到此為止的代碼給替換掉了,,比如你拖了個SqlConnection控件,設(shè)置了連接信息屬性,,就等于下面兩句代碼,。只不過如今是咱自己很實在的構(gòu)造出來滴,而拖個SqlConnection控件的話,,是由微軟.NET環(huán)境給你自動構(gòu)造的,,方式迥異,效果相同,,心情不同,。

private SqlConnection myCon ;

myCon = new SqlConnection("Data Source=localhost\\SQLEXPRESS;Initial Catalog=Shop;Persist Security Info=True;User ID=sa;Password= ");

這有關(guān)鍵的一句,,有必要說一下

myCbd = new SqlCommandBuilder(myAda);

這又是干什么滴,?這得先說一下SqlCommandBuilder有什么妙用,我們從字面意思翻譯一下,Sql就是Sql,,眾人名其曰結(jié)構(gòu)化查詢語言,;Command,名令,;Builder,,構(gòu)造,建造,,不太好,,人家?guī)Я藗€er,學(xué)過E文的都知道,,這是個名詞,,那就譯之為構(gòu)造器,建造者能說得過去,。Sql命令構(gòu)造器,,這下恍然明白了,就是用來構(gòu)造Sql命令的,,比如你更新數(shù)據(jù)庫需要一個Update,,通過這句它就給咱構(gòu)造出來了。那么Sql命令構(gòu)造器這個東西又是怎么生成咱需要的Sql語句命令的,?它怎么知道我們要什么樣滴,?其實它不知道,是我們給了它提示信息,,不過它實在是太聰明了,,就這么點提示信息人家就舉一反三,根據(jù)這點提示推斷出我們的需求,。那我們在哪里給提示了,,看這句myAda.SelectCommand = myCmd;我們把查詢的Sql命令給了出來,給了DataAdaper數(shù)據(jù)適配器的SelectCommand,,而我們又把DataAdaper數(shù)據(jù)適配器(在這里為myAda)作為參數(shù)丟給了SqlCommandBuilder,,這下好了,被SqlCommandBuilder抓到了,,它就這樣輕松加愉快的,,根據(jù)抓到的DataAdaper的SelectCommand信息,一骨碌的把其它的Sql操作命令都給生成出來了,??赡苡信笥褑柫耍也挥眠@個命令構(gòu)造器生成Sql操作命令行不,?當然是可以了,,要是總覺得它自動給搞出來的不符合我們的要求,,我們完全可以自己寫的靈活點,像下面這樣就可以了:

myAda.DeleteCommand = New SqlCommand("delete * from UserInfo where .....")

經(jīng)過上面的這一番折騰,,已萬事俱備,,我們的數(shù)據(jù)適配器已經(jīng)可以使用自身的利器SqlCommand對數(shù)據(jù)庫進行操作了;等等,,有點問題,,我們數(shù)據(jù)表里的字段名字起的都是英文,那么程序運行也是默認英文顯示,,作為堂堂中國人,,這點是不能原諒的,那有我們的方塊字看著賞心悅目,。沒有關(guān)系,,看下面代碼:

myAda.TableMappings.Add("UserInfo", "UserInfo");

myAda.TableMappings[0].ColumnMappings.Add("UserID", "用戶");

myAda.TableMappings[0].ColumnMappings.Add("UserName", "用戶姓名");

myAda.TableMappings[0].ColumnMappings.Add("UserAge", "年齡");

myAda.TableMappings[0].ColumnMappings.Add("UserSex", "性別");

myAda.TableMappings[0].ColumnMappings.Add("UserAddress", "地址");

微軟也尊重我們,通過DataAdaper給我們提供了TableMappings屬性,,利用它就可以把數(shù)據(jù)庫里的千奇百怪的字段名毫不費力的給轉(zhuǎn)成我們需要的名字,,人家這里稱作是映射。這下總算差不多了,,我們要開始行動了,,要對數(shù)據(jù)庫動刀了,開頭做了那么多準備,,接下來就輕松了。首先是從數(shù)據(jù)表里查詢數(shù)據(jù),,就是我們慣用的Select,,myAda.Fill(mySet, "UserInfo");這句就行了,這么簡單,?是啊,,這里myAda到底給我們做了什么?它做的也不少哦,,它先要自動的把我們的數(shù)據(jù)庫連接打開,,就是上面代碼中已經(jīng)定義好的那個連接對象;完了尋覓到myAda數(shù)據(jù)適配器的SelectCommand命令,,根據(jù)這個SelectCommand命令去數(shù)據(jù)表里查詢數(shù)據(jù),,最后把提取到的數(shù)據(jù)放進了DataSet(在此為mySet)中的一個DataTable(在此為UserInfo)中,等到一切做完后,,還會很負責(zé)任的把它自己打開的連接給關(guān)閉掉,,哈哈,很不錯的一個家伙哦,!查詢完成了,,更新,,刪除當然也是不在話下了,我們在dataGridView控件中編輯完數(shù)據(jù)后,,會首先將變化反映到關(guān)聯(lián)的DataSet的DataTable中,接下來還是數(shù)據(jù)適配器上場,直接調(diào)用它的Update萬能方法就可以了,就會把我們的數(shù)據(jù)的更改寫到源數(shù)據(jù)表中了.這里萬能的背后仍然是DataAdaper的SqlCommand命令,我們此前已經(jīng)為它們配置好了,這里的一切就交給Update方法吧.這里要羅索一下的是mySet.Tables[0].AcceptChanges(),這句很有用,要不你更新一條后,接著再去更新第二條,第三條的話,就會出現(xiàn)異常,因為一次更新發(fā)生后,DataSet會對本次更新掛起,到下一次更新的時候又會重復(fù)進行上一次掛起的更改,所以在每次更新后必須調(diào)用AcceptChanges來清除掛起的更改.

      仗著ADO.NET來對數(shù)據(jù)庫進行操作真的太方便了,方法也很多,熟練了會發(fā)現(xiàn)我怎么寫都能實現(xiàn)對數(shù)據(jù)庫的操作,一種很隨意的感覺.我這里對DataAdapter搗弄了半天, 也只是羅嗦個皮毛,深入的內(nèi)容咱再一起探究吧,。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多