轉貼: ADO.Net Adapter操作資料

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

  在本篇文章中,我將自己手動寫程式碼完成利用DataAdapter進行資料訪問操作,以便能讓初學DataAdapter的朋友明白它背後啟動並執行一些情況。在此,我以SqlServer2005Express資料庫作為資料來源伺服器,因此需要用到的是SqlDataAdapterData Access Objects,對於其它的OleDbDataAdapter等對象與此是類似的,也希望這篇文章對於初學者能起到拋磚引玉的微薄作用吧。首先在SqlServer2005Express裡建立資料庫作為資料來源,關於此過程的實現可以通過資料定義語句或直接利用可視化介面來完成。我們將通過dataGridView控制項來顯示資料,詳細的代碼如下所示:

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

            {

               //將更改的資料更新到資料表裡

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

                MessageBox.Show("資料更新成功!");

               //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("確定要刪除當前行資料?", "", MessageBoxButtons.OKCancel) == DialogResult.OK)

            {

                try

                {

                    //將更改的資料更新到資料表裡

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

                    MessageBox.Show("資料刪除成功!");

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

                    mySet.Tables[0].AcceptChanges();

                }

                catch (SqlException ex)

                {

                    MessageBox.Show(ex.ToString());

                }

            }

            else

            {

               //取消對DataTable的更改

                mySet.Tables[0].RejectChanges();

            }

        }

    }

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

 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();

這幾句這麼一寫,你的功勞可就大了,前面聲明的那幾個變數所引用的物件現在已經誕生了,像出世的孩子它們從這一刻起有了寶貴的生命。其實呢,通過工具箱拖控制項的舉動基本上可以由到此為止的代碼給替換掉了,比如你拖了個SqlConnection控制項,設定了串連資訊屬性,就等於下面兩句代碼。只不過如今是咱自己很實在的構造出來滴,而拖個SqlConnection控制項的話,是由微軟.NET環境給你自動構造的,方式迥異,效果相同,心情不同。

private SqlConnection myCon ;

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

這有關鍵的一句,有必要說一下

myCbd = new SqlCommandBuilder(myAda);

這又是幹什麼滴?這得先說一下SqlCommandBuilder有什麼妙用,我們從字面意思翻譯一下,Sql就是Sql,眾人名其曰結構化查詢語言 (SQL);Command,名令;Builder,構造,建造,不太好,人家帶了個er,學過E文的都知道,這是個名詞,那就譯之為構造器,建造者能說得過去。Sql命令構造器,這下恍然明白了,就是用來構造Sql命令的,比如你更新資料庫需要一個Update,通過這句它就給咱構造出來了。那麼Sql命令構造器這個東西又是怎麼產生咱需要的Sql語句命令的?它怎麼知道我們要什麼樣滴?其實它不知道,是我們給了它提示資訊,不過它實在是太聰明了,就這麼點提示資訊人家就舉一反三,根據這點提示推斷出我們的需求。那我們在哪裡給提示了,看這句myAda.SelectCommand = myCmd;我們把查詢的Sql命令給了出來,給了DataAdaper資料配接器的SelectCommand,而我們又把DataAdaper資料配接器(在這裡為myAda)作為參數丟給了SqlCommandBuilder,這下好了,被SqlCommandBuilder抓到了,它就這樣輕鬆加愉快的,根據抓到的DataAdaper的SelectCommand資訊,一骨碌的把其它的Sql操作命令都給產生出來了。可能有朋友問了,我不用這個命令構造器產生Sql操作命令列不?當然是可以了,要是總覺得它自動給搞出來的不符合我們的要求,我們完全可以自己寫的靈活點,像下面這樣就可以了:

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

經過上面的這一番折騰,已萬事俱備,我們的資料配接器已經可以使用自身的利器SqlCommand對資料庫進行操作了;等等,有點問題,我們資料表裡的欄位名字起的都是英文,那麼程式運行也是預設英文顯示,作為堂堂中國人,這點是不能原諒的,那有我們的方塊字看著賞心悅目。沒有關係,看下面代碼:

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屬性,利用它就可以把資料庫裡的千奇百怪的欄位名毫不費力的給轉成我們需要的名字,人家這裡稱作是映射。這下總算差不多了,我們要開始行動了,要對資料庫動刀了,開頭做了那麼多準備,接下來就輕鬆了。首先是從資料表裡查詢資料,就是我們慣用的Select,myAda.Fill(mySet, "UserInfo");這句就行了,這麼簡單?是啊,這裡myAda到底給我們做了什嗎?它做的也不少哦,它先要自動的把我們的資料庫連接開啟,就是上面代碼中已經定義好的那個連線物件;完了尋覓到myAda資料配接器的SelectCommand命令,根據這個SelectCommand命令去資料表裡查詢資料,最後把提取到的資料放進了DataSet(在此為mySet)中的一個DataTable(在此為UserInfo)中,等到一切做完後,還會很負責任的把它自己開啟的串連給關閉掉,哈哈,很不錯的一個傢伙哦!查詢完成了,更新,刪除當然也是不在話下了,我們在dataGridView控制項中編輯完資料後,會首先將變化反映到關聯的DataSet的DataTable中,接下來還是資料配接器上場,直接調用它的Update萬能方法就可以了,就會把我們的資料的更改寫到來源資料表中了.這裡萬能的背後仍然是DataAdaper的SqlCommand命令,我們此前已經為它們配置好了,這裡的一切就交給Update方法吧.這裡要羅索一下的是mySet.Tables[0].AcceptChanges(),這句很有用,要不你更新一條後,接著再去更新第二條,第三條的話,就會出現異常,因為一次更新發生後,DataSet會對本次更新掛起,到下一次更新的時候又會重複進行上一次暫止的變更,所以在每次更新後必須調用AcceptChanges來清除暫止的變更.

      仗著ADO.NET來對資料庫進行操作真的太方便了,方法也很多,熟練了會發現我怎麼寫都能實現對資料庫的操作,一種很隨意的感覺.我這裡對DataAdapter搗弄了半天, 也只是羅嗦個皮毛,深入的內容咱再一起探究吧。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.