C#學(xué)習(xí)之路(1)--數(shù)據(jù)庫技術(shù)

前言

在7月10日就要去揚州實習(xí)了,首先是為期2個月的培訓(xùn)狂打。一個月的Java擂煞,一個月的C#。在這一個月里面趴乡,準(zhǔn)備梳理一下java和C#的基礎(chǔ)知識对省,同時也進(jìn)行更深一步的學(xué)習(xí)。最近也一直在聽八三夭的一首晾捏,我不想改變世界蒿涎,我只想不被世界改變。同時也對自己的未來充滿著信心和憧憬惦辛。


ADO.NET概述

ADO.NET是美國微軟公司推出的.NET平臺中的一種數(shù)據(jù)訪問技術(shù)劳秋。ADO.NET類庫中提供了用于數(shù)據(jù)連接,處理數(shù)據(jù)操作的類。


ADO.NET組件

ADO.NET有2個重要的組成部分:DataSet對象和.NET數(shù)據(jù)提供者玻淑。
DataSet對象用于以表格形式在程序中放置一組數(shù)據(jù)嗽冒,它不關(guān)心數(shù)據(jù)的來源。
數(shù)據(jù)提供者包含很多針對數(shù)據(jù)源的組件补履,設(shè)計者通過這些組件可以使程序與指定的數(shù)據(jù)源進(jìn)行鏈接添坊。.NET數(shù)據(jù)提供者主要包括:Connection對象,Command對象,DataReader對象以及DataAdapter對象。


DataSet對象

ADO.NET一個比較突出的特點是支持離線訪問箫锤,即在非連接環(huán)境下對數(shù)據(jù)進(jìn)行處理贬蛙。DataSet是支持離線訪問的關(guān)鍵對象,它將數(shù)據(jù)存儲在緩存中麻汰。


創(chuàng)建一個ADO.NET數(shù)據(jù)庫應(yīng)用程序一般步驟

  • 創(chuàng)建Windows窗體速客。
  • 創(chuàng)建Connection對象,連接數(shù)據(jù)庫。創(chuàng)建Command對象五鲫,執(zhí)行SQL命令溺职。
  • 創(chuàng)建DataAdapter對象,提供數(shù)據(jù)源與記錄集之間的數(shù)據(jù)交換位喂,數(shù)據(jù)庫與內(nèi)存中的數(shù)據(jù)交換浪耘。
  • 創(chuàng)建DataSet對象,將從數(shù)據(jù)源中得到的數(shù)據(jù)保存在內(nèi)存中塑崖,然后對數(shù)據(jù)進(jìn)行相關(guān)的各種操作七冲。

具體代碼

  • 數(shù)據(jù)庫連接

    調(diào)用Connection對象的open()方法進(jìn)行指定的數(shù)據(jù)源連接。
    Close()方法肯定就是關(guān)閉指定的數(shù)據(jù)源連接咯规婆。
    Dispose()方法肯定就是釋放Connection對象所占的資源了澜躺。
    一般使用try {}catch {}finally{}塊進(jìn)行相關(guān)數(shù)據(jù)庫相關(guān)的操作。

String url = @"Data Source=KQVRDUTYAH5ADL1\SQLEXPRESS;Initial Catalog=user;Integrated Security=True";
            conn = new SqlConnection(url);
            conn.Open();
  • 創(chuàng)建Command對象

    Command對象用于執(zhí)行數(shù)據(jù)庫的命令操作抒蚜。
    ExecuteNonQuery():一般用于刪除掘鄙,修改,更新等操作嗡髓。返回一個int型數(shù)據(jù)操漠,就是受查詢影響的行數(shù)。一般大于0就是操作成功饿这,反之浊伙,操作失敗。
    ExecuteReader():一般用于查詢操作长捧,返回一個數(shù)據(jù)集Reader對象嚣鄙。通過遍歷Reader,就能獲取查詢的數(shù)據(jù)串结。這跟MySQL的ResultSet很像拗慨。

   String sql = "insert into Student values('" + name + "','" + course + "')";
  sqlCommand.CommandText = sql;
  int result = sqlCommand.ExecuteNonQuery();
  • 創(chuàng)建DataAdapter對象

    SelectCommand廓八,InsertCommand,UpdateCommand,DeleteCommand這是DataAdapter對象的4個屬性。用于定義處理數(shù)據(jù)存儲中數(shù)據(jù)的命令赵抢,并且每一個命令都是對Command對象的一個引用,可以共享同一個數(shù)據(jù)源声功。

    Fill()方法:該方法用于執(zhí)行SelectCommand里面的SQL命令烦却,把數(shù)據(jù)源的數(shù)據(jù)填充到DataSet對象。
    Update()方法:該方法用于將DataSet對象中某一個數(shù)據(jù)表更改的內(nèi)容更新到對應(yīng)的真實的數(shù)據(jù)庫里面的數(shù)據(jù)表中先巴。

 adapter = new SqlDataAdapter(s, conn);

  • 創(chuàng)建SqlCommandBuilder對象

    創(chuàng)建這個對象其爵,需要傳入SqlDataAdapter的對象。為什么要創(chuàng)建這個對象?因為這個對象可以自動生成與DataSet對象關(guān)聯(lián)的操作伸蚯,如更新摩渺,刪除,增加等剂邮。如果沒有這個對象摇幻,SqlDataAdapter對象調(diào)用Update()方法會報一個異常:System.InvalidOperationException: 當(dāng)傳遞具有已修改行的 DataRow 集合時,更新要求有效的 UpdateCommand

   scb = new SqlCommandBuilder(adapter);
  • 創(chuàng)建DataSet對象

    DataSet對象用于實現(xiàn)通過DataAdapter里面的數(shù)據(jù)來提供程序控件與數(shù)據(jù)庫相連接挥萌。DataSet的結(jié)構(gòu)與關(guān)系數(shù)據(jù)庫的結(jié)構(gòu)很相似绰姻,它包括表集合(TABLES)和描述表之間關(guān)系的表集合。

    AcceptChanges()方法:該方法一般用于修改了DataSet對象里面某一個表里面的內(nèi)容引瀑,然后把修改的具體內(nèi)容提交給DataSet對象中的表狂芋,調(diào)用了這個方法,RowState記錄就初始化了憨栽,注意:如果用調(diào)用到RowState初始化的DataTable再去調(diào)用Update()方法去更新數(shù)據(jù)庫里面的表帜矾,將不會有任何變化。

  //DataSet對象用于實現(xiàn)DataAdapter數(shù)據(jù)提供程序控件與數(shù)據(jù)庫相連接
  //DataSet的結(jié)構(gòu)與關(guān)系數(shù)據(jù)庫的機(jī)構(gòu)相似屑柔,它包括表集合和描述表之間的關(guān)系集合
            data = new DataSet("myDataSet");

            DataTable myTable = new DataTable("StudentTable");

            data.Tables.Add(myTable);

            //把數(shù)據(jù)源中的數(shù)據(jù)填充到DataSet對象
            adapter.Fill(data, "StudentTable");

            dataGridView1.DataSource = myTable;
  • 完整實例代碼
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace WindowsFormsApplication19
{
    public partial class dasd : Form
    {
        //BindingManagerBase類是一個抽象類屡萤,管理所有
        //綁定相同的數(shù)據(jù)源和數(shù)據(jù)成員的控件
        private BindingManagerBase myBind;
        private String TAG = "Form";

        private SqlConnection conn;
        private SqlDataAdapter adapter;
        private DataSet data ;
        //這樣會讓SqlDataAdapter對象自動實現(xiàn)與DataSet更改和關(guān)聯(lián)的SQL語句
        private SqlCommandBuilder scb;
        private int i;
        private int selectedId=-1;
        private int selectedSid=-1;
        private SqlCommand sqlCommand;
        public dasd()
        {
            InitializeComponent();
            //設(shè)置DataGirdView選中模式 為每一行選中
            this.dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            initData();
        }

        private void initData()
        {
            String url = @"Data Source=KQVRDUTYAH5ADL1\SQLEXPRESS;Initial Catalog=user;Integrated Security=True";
            conn = new SqlConnection(url);
            conn.Open();
            String s = "select * from Student";

            
            adapter = new SqlDataAdapter(s, conn);

            scb = new SqlCommandBuilder(adapter);

            //DataSet對象用于實現(xiàn)DataAdapter數(shù)據(jù)提供程序控件與數(shù)據(jù)庫相連接
            //DataSet的結(jié)構(gòu)與關(guān)系數(shù)據(jù)庫的機(jī)構(gòu)相似,它包括表集合和描述表之間的關(guān)系集合
            data = new DataSet("myDataSet");

            DataTable myTable = new DataTable("StudentTable");

            data.Tables.Add(myTable);

            //把數(shù)據(jù)源中的數(shù)據(jù)填充到DataSet對象
            adapter.Fill(data, "StudentTable");

            dataGridView1.DataSource = myTable;

            sqlCommand = new SqlCommand(s,conn);
        }

        private void add_Click_1(object sender, EventArgs e)
        {

            String name="獨一無二的小馬同志"+i;
            String course="計算機(jī)";
            String sql = "insert into Student values('" + name + "','" + course + "')";
            sqlCommand.CommandText = sql;
           
            int result = sqlCommand.ExecuteNonQuery();
          
            if (result>0)
            {
                MessageBox.Show("添加記錄成功!");
            }

            doUpdateDataSet();
            i++;


        }

        private void button1_Click(object sender, EventArgs e)
        {

            MyLog.i(TAG, "selectedId=" + selectedId);
            if (selectedId ==-1)
            {
                MessageBox.Show("沒有選中任何一項");
                return;
            }

           //先從DataSet獲取我們之前定義的StudentTable表
            DataTable myTable = data.Tables["StudentTable"];

            myTable.Rows[selectedId].Delete();

            //對指定的數(shù)據(jù)集DataSet中的數(shù)據(jù)表StudentTable更新到數(shù)據(jù)源锯蛀。
           int result= adapter.Update(data,"StudentTable");
           MyLog.i(TAG,"result="+result);
           if (result>0)
           {
               MessageBox.Show("刪除記錄成功");
           }

           //把修改結(jié)果提交到數(shù)據(jù)集dataset中的數(shù)據(jù)表studenttable
           data.AcceptChanges();
           selectedId = -1;
           selectedSid = -1;
           dataGridView1.Rows[int.Parse(dataGridView1.RowCount.ToString())-1].Selected = false;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //默認(rèn)不選中
            if (dataGridView1.RowCount > 0)
            {
                dataGridView1.Rows[0].Selected = false;
            }

            dataGridView1.AllowUserToAddRows = false;
            //設(shè)置只讀模式
            dataGridView1.ReadOnly = true;
        }

        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            //獲取當(dāng)前行的index
            selectedId = dataGridView1.CurrentRow.Index;
            //獲取當(dāng)前行的sid
            selectedSid = int.Parse(dataGridView1.Rows[selectedId].Cells[0].Value.ToString());
            MyLog.i(TAG, "您選中的selectedId=" + selectedId + ",sid=" + selectedSid);
        }

        private void del1_Click(object sender, EventArgs e)
        {

            if (selectedId == -1)
            {
                MessageBox.Show("您沒有選中任何一項");
                return;
            }
            MyLog.i(TAG, "selectedId=" + selectedId+",sid="+selectedSid);
            String sql = "delete from Student where sid=" + selectedSid;

            sqlCommand.CommandText = sql;
            int result = sqlCommand.ExecuteNonQuery();
            if (result>0)
            {
                MessageBox.Show("刪除成功");
            }
            doUpdateDataSet();
        }

        private void doUpdateDataSet()
        {

            data.Tables.Clear();
            data.AcceptChanges();
            adapter.Fill(data, "StudentTable");
            dataGridView1.DataSource = data.Tables["StudentTable"];
            dataGridView1.Rows[0].Selected = false;
            selectedId = -1;
            selectedSid = -1;
        }

        private void add1_Click(object sender, EventArgs e)
        {
            DataTable myTable=data.Tables["StudentTable"];
            //要添加的sid 肯定是最后一項數(shù)據(jù)的sid+1
            int sid=int.Parse(dataGridView1.Rows[int.Parse(dataGridView1.RowCount.ToString())-1].Cells[0].Value.ToString())+1;
            Object[] newRow = {sid, "我是沉夢" + i, "英語" };
            myTable.Rows.Add(newRow);
            int result = adapter.Update(data, "StudentTable");
            if (result > 0)
            {
                MessageBox.Show("添加成功");
            }

            //把修改結(jié)果提交給DataSet中的表里
            data.AcceptChanges();
            i++;
        }

        private void edit1_Click(object sender, EventArgs e)
        {
            int sid = selectedSid;
            MyLog.i(TAG,"sid=" + sid);
            String sql="update Student set name='"+textBox2.Text+"', course='"+textBox3.Text+"'  where sid='"+sid+"'";

            sqlCommand.CommandText = sql;

            int result = sqlCommand.ExecuteNonQuery();

            if (result > 0)
            {
                MessageBox.Show("修改成功灭衷!");
            }
            else
            {
                MessageBox.Show("修改失敗!");
            }
            doUpdateDataSet();                                                                                      
        }

        private void edit2_Click(object sender, EventArgs e)
        {
            DataTable myTable=data.Tables["StudentTable"];
            //獲取某一行指定列的值
            myTable.Rows[selectedId]["name"]=textBox2.Text;
            myTable.Rows[selectedId]["course"] = textBox3.Text;
            int result=adapter.Update(data, "StudentTable");
            if (result > 0)
            {
                MessageBox.Show("修改成功!");
            }
            else
            {
                MessageBox.Show("修改失敗!");
            }

            data.AcceptChanges();

        }

    }
}
  • 演示效果


    這里寫圖片描述

尾言

這樣一個基本的數(shù)據(jù)庫程序就完成了,實現(xiàn)了基本的增刪改查等功能旁涤。如果你們有時間翔曲,可以進(jìn)行更一步的優(yōu)化,實現(xiàn)代碼的復(fù)用呢劈愚。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瞳遍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子菌羽,更是在濱河造成了極大的恐慌掠械,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異猾蒂,居然都是意外死亡均唉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進(jìn)店門肚菠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舔箭,“玉大人,你說我怎么就攤上這事蚊逢〔惴觯” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵烙荷,是天一觀的道長镜会。 經(jīng)常有香客問我,道長终抽,這世上最難降的妖魔是什么戳表? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮拿诸,結(jié)果婚禮上扒袖,老公的妹妹穿的比我還像新娘。我一直安慰自己亩码,他們只是感情好季率,可當(dāng)我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著描沟,像睡著了一般飒泻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吏廉,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天泞遗,我揣著相機(jī)與錄音,去河邊找鬼席覆。 笑死史辙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的佩伤。 我是一名探鬼主播聊倔,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼生巡!你這毒婦竟也來了耙蔑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤孤荣,失蹤者是張志新(化名)和其女友劉穎甸陌,沒想到半個月后须揣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡钱豁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年耻卡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寥院。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡劲赠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出秸谢,到底是詐尸還是另有隱情,我是刑警寧澤霹肝,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布估蹄,位于F島的核電站,受9級特大地震影響沫换,放射性物質(zhì)發(fā)生泄漏臭蚁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一讯赏、第九天 我趴在偏房一處隱蔽的房頂上張望垮兑。 院中可真熱鬧,春花似錦漱挎、人聲如沸系枪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽私爷。三九已至,卻和暖如春膊夹,著一層夾襖步出監(jiān)牢的瞬間衬浑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工放刨, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留工秩,地道東北人。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓进统,卻偏偏與公主長得像助币,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子麻昼,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容