C#學習之路(1) 數據庫技術

####前言 在7月10日就要去揚州實習了,首先是爲期2個月的培訓。一個月的Java,一個月的C#。在這一個月裏面,準備梳理一下java和C#的基礎知識,同時也進行更深一步的學習。最近也一直在聽八三夭的一首,我不想改變世界,我只想不被世界改變。同時也對本身的將來充滿着信心和憧憬。java


####ADO.NET概述 ADO.NET是美國微軟公司推出的.NET平臺中的一種數據訪問技術。ADO.NET類庫中提供了用於數據鏈接,處理數據操做的類。sql


####ADO.NET組件 ADO.NET有2個重要的組成部分:DataSet對象和.NET數據提供者。 DataSet對象用於以表格形式在程序中放置一組數據,它不關心數據的來源。 數據提供者包含不少針對數據源的組件,設計者經過這些組件可使程序與指定的數據源進行連接。.NET數據提供者主要包括:Connection對象,Command對象,DataReader對象以及DataAdapter對象。數據庫


####DataSet對象 ADO.NET一個比較突出的特色是支持離線訪問,即在非鏈接環境下對數據進行處理。DataSet是支持離線訪問的關鍵對象,它將數據存儲在緩存中。緩存


####建立一個ADO.NET數據庫應用程序通常步驟bash

  • 建立Windows窗體。
  • 建立Connection對象,鏈接數據庫。建立Command對象,執行SQL命令。
  • 建立DataAdapter對象,提供數據源與記錄集之間的數據交換,數據庫與內存中的數據交換。
  • 建立DataSet對象,將從數據源中獲得的數據保存在內存中,而後對數據進行相關的各類操做。

####具體代碼學習

  • 數據庫鏈接優化

    調用Connection對象的**open()**方法進行指定的數據源鏈接。 **Close()**方法確定就是關閉指定的數據源鏈接咯。 **Dispose()方法確定就是釋放Connection對象所佔的資源了。 通常使用try {}catch {}finally{}**塊進行相關數據庫相關的操做。ui

String url = @"Data Source=KQVRDUTYAH5ADL1\SQLEXPRESS;Initial Catalog=user;Integrated Security=True";
            conn = new SqlConnection(url);
            conn.Open();
複製代碼
  • 建立Command對象this

    Command對象用於執行數據庫的命令操做。 ExecuteNonQuery():通常用於刪除,修改,更新等操做。返回一個int型數據,就是受查詢影響的行數。通常大於0就是操做成功,反之,操做失敗。 ExecuteReader():通常用於查詢操做,返回一個數據集Reader對象。經過遍歷Reader,就能獲取查詢的數據。這跟MySQL的ResultSet很像。url

String sql = "insert into Student values('" + name + "','" + course + "')";
  sqlCommand.CommandText = sql;
  int result = sqlCommand.ExecuteNonQuery();
複製代碼
  • 建立DataAdapter對象

    SelectCommand,InsertCommand,UpdateCommand,DeleteCommand這是DataAdapter對象的4個屬性。用於定義處理數據存儲中數據的命令,而且每個命令都是對Command對象的一個引用,能夠共享同一個數據源。

    **Fill()方法:**該方法用於執行SelectCommand裏面的SQL命令,把數據源的數據填充到DataSet對象。 **Update()方法:**該方法用於將DataSet對象中某一個數據表更改的內容更新到對應的真實的數據庫裏面的數據表中。

adapter = new SqlDataAdapter(s, conn);

複製代碼
  • 建立SqlCommandBuilder對象

    建立這個對象,須要傳入SqlDataAdapter的對象。爲何要建立這個對象?由於這個對象能夠自動生成與DataSet對象關聯的操做,如更新,刪除,增長等。若是沒有這個對象,SqlDataAdapter對象調用**Update()**方法會報一個異常:System.InvalidOperationException: 當傳遞具備已修改行的 DataRow 集合時,更新要求有效的 UpdateCommand

scb = new SqlCommandBuilder(adapter);
複製代碼
  • 建立DataSet對象

    DataSet對象用於實現經過DataAdapter裏面的數據來提供程序控件與數據庫相鏈接。DataSet的結構與關係數據庫的結構很類似,它包括表集合(TABLES)和描述表之間關係的表集合。

    **AcceptChanges()方法:**該方法通常用於修改了DataSet對象裏面某一個表裏面的內容,而後把修改的具體內容提交給DataSet對象中的表,調用了這個方法,RowState記錄就初始化了,**注意:**若是用調用到RowState初始化的DataTable再去調用Update()方法去更新數據庫裏面的表,將不會有任何變化。

//DataSet對象用於實現DataAdapter數據提供程序控件與數據庫相鏈接
  //DataSet的結構與關係數據庫的機構類似,它包括表集合和描述表之間的關係集合
            data = new DataSet("myDataSet");

            DataTable myTable = new DataTable("StudentTable");

            data.Tables.Add(myTable);

            //把數據源中的數據填充到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類是一個抽象類,管理全部
        //綁定相同的數據源和數據成員的控件
        private BindingManagerBase myBind;
        private String TAG = "Form";

        private SqlConnection conn;
        private SqlDataAdapter adapter;
        private DataSet data ;
        //這樣會讓SqlDataAdapter對象自動實現與DataSet更改和關聯的SQL語句
        private SqlCommandBuilder scb;
        private int i;
        private int selectedId=-1;
        private int selectedSid=-1;
        private SqlCommand sqlCommand;
        public dasd()
        {
            InitializeComponent();
            //設置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對象用於實現DataAdapter數據提供程序控件與數據庫相鏈接
            //DataSet的結構與關係數據庫的機構類似,它包括表集合和描述表之間的關係集合
            data = new DataSet("myDataSet");

            DataTable myTable = new DataTable("StudentTable");

            data.Tables.Add(myTable);

            //把數據源中的數據填充到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="計算機";
            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();

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

           //把修改結果提交到數據集dataset中的數據表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)
        {
            //默認不選中
            if (dataGridView1.RowCount > 0)
            {
                dataGridView1.Rows[0].Selected = false;
            }

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

        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            //獲取當前行的index
            selectedId = dataGridView1.CurrentRow.Index;
            //獲取當前行的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 確定是最後一項數據的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("添加成功");
            }

            //把修改結果提交給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();

        }

    }
}
複製代碼
  • 演示效果
    這裏寫圖片描述

####尾言 這樣一個基本的數據庫程序就完成了,實現了基本的增刪改查等功能。若是大家有時間,能夠進行更一步的優化,實現代碼的複用呢。

相關文章
相關標籤/搜索