免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
[轉(zhuǎn)帖]ADO.net中適配器DataAdapter的說(shuō)明

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

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

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", "用戶(hù)");

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

            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接受更改,以便為下一次更改作準(zhǔn)備

                mySet.Tables[0].AcceptChanges();

            }

            catch (SqlException ex)

            {

                ex.ToString();

            }

        }

        private void bt_Delete_Click(object sender, EventArgs e)

        {

            //從DataTable中刪除當(dāng)前選中的行

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

            if (MessageBox.Show("確定要?jiǎng)h除當(dāng)前行數(shù)據(jù)?", "", MessageBoxButtons.OKCancel) == DialogResult.OK)

            {

                try

                {

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

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

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

                    //DataTable接受更改,以便為下一次更改作準(zhǔn)備

                    mySet.Tables[0].AcceptChanges();

                }

                catch (SqlException ex)

                {

                    MessageBox.Show(ex.ToString());

                }

            }

            else

            {

               //取消對(duì)DataTable的更改

                mySet.Tables[0].RejectChanges();

            }

        }

    }

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

private SqlConnection myCon;

private SqlDataAdapter myAda;

private SqlCommand myCmd;

private SqlCommandBuilder myCbd;

private DataSet mySet;

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

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ě),你的功勞可就大了,前面聲明的那幾個(gè)變量所引用的物件現(xiàn)在已經(jīng)誕生了,像出世的孩子它們從這一刻起有了寶貴的生命。其實(shí)呢,通過(guò)工具箱拖控件的舉動(dòng)基本上可以由到此為止的代碼給替換掉了,比如你拖了個(gè)SqlConnection控件,設(shè)置了連接信息屬性,就等于下面兩句代碼。只不過(guò)如今是咱自己很實(shí)在的構(gòu)造出來(lái)滴,而拖個(gè)SqlConnection控件的話(huà),是由微軟.NET環(huán)境給你自動(dòng)構(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)鍵的一句,有必要說(shuō)一下

myCbd = new SqlCommandBuilder(myAda);

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

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

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

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

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

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

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

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

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

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

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

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
DataBase和DataSet同步數(shù)據(jù)
VA10.4數(shù)據(jù)適配-DataAdapter對(duì)象
DataAdapter的TableMappings具體是怎么使用的
dataAdapter的TableMappings屬性在開(kāi)發(fā)中有什么用? - Rey的技術(shù)博客 - CSDNBlog
ADO.NET的記憶碎片(三)
使用 Bulk Copy 將大量數(shù)據(jù)復(fù)制到數(shù)據(jù)庫(kù)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服