C# 實作SQLServer資料庫範例

主旨:

實做資料庫的四個基本操作
INSERT、UPDATE、DELETE、SELECT
這邊會做到一種很屌的東西叫「藕合」
抽像到不行,建議看一下維基百科
用比喻是像離合器的東西,構連引擎及輪胎間的動力傳輸
這裡會用到一個叫BindingSource類別,它就像中間離合器
好的程式會是鬆散藕合,要進行修改相當容易
以下是預期會呈現的結果:


按下其中的「新增」按鈕會跳出視窗後輸入完新增回去
不可調整大小,沒有最大及最小的按扭:

大致如此。





說明:
第2個視窗的設定比較好說,先新增一個視窗Form2.cs
並在其中元件屬性設為以下的設定:
FormBorderStyle 設為.Fixed3D;
MaximizeBox = false
MinimizeBox = false

再來是Form1.cs的程式碼:


BindingSource bs;
//由bs綁定資料庫資源        
public Form1()
{
    InitializeComponent();
    loadData();
    ShowRecordStuts();
}

loadData();


void loadData()
{
    SqlConnection cnn = new SqlConnection("server=localhost;database=練練;UID=SQLUser;PWD=1234");
    SqlCommand cmd = new SqlCommand("SELECT 產品編號,品名,價錢 FROM 巨巨",cnn);
    cnn.Open();
    SqlDataReader mydr = cmd.ExecuteReader();
    DataTable tt = new DataTable();
    tt.Load(mydr);
    mydr.Close();
    cmd.Clone();
    cnn.Close();

    bs = new BindingSource();
    bs.DataSource = tt;
    L_Id.DataBindings.Add("Text",bs,"產品編號");
    T_name.DataBindings.Add("Text", bs, "品名");
    T_price.DataBindings.Add("Text", bs, "價錢");

    dataGridView1.DataSource = bs;
}

顯示目前筆數及選取狀態
ShowRecordStuts();


private void ShowRecordStuts()
{
    Sorce_info.Text = String.Format("目前選擇第{0}筆,共{1}筆資料",bs.Position+1,bs.Count);
}

第一筆、最後一筆、上一筆、下一筆等按鈕


private void RecordMoveEvent(object sender, EventArgs e)
{
    Button btn = sender as Button;
    switch (btn.Text)
    {
        case "第一筆": bs.MoveFirst(); break;
        case "上一筆": bs.MovePrevious();  break;
        case "下一筆": bs.MoveNext();  break;
        case "最後一筆": bs.MoveLast(); break;
    }
    ShowRecordStuts();
}

新增資料按鈕:


private void button1_Click(object sender, EventArgs e)
{
    foreach(Form ff in Application.OpenForms)
    {
        //檢測目前所有視窗
        if (ff.Text == "新增資料")
        {
            //若視窗的標題="新增資料"
            ff.Activate();//拉到最前作用中的視窗
            return;//整個結束button1_Click,form2就不會被new出來
        }
    }

    Form2 f2 = new Form2(); 
    f2.ProductList = bs.DataSource as DataTable;
    //Form2中的方法,用來取得BindingSource

    f2.Show();
    //f2.ShowDialog();//像Dialog般秀出來(沒操作此視窗, 不能執行其他視窗)
}

修改按鈕:


private void button2_Click(object sender, EventArgs e)
{
    DialogResult ans = MessageBox.Show("確定更新此筆資料?", "確定更新", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
    if (ans == System.Windows.Forms.DialogResult.Yes)
    {
        SqlConnection conn = new SqlConnection("server=localhost;database=練練;UID=SQLAdmin;PWD=1234;");

        //string sql = "INSERT INTO 巨巨 VALUES(" + TB_Id.Text + ",'" + TB_Name.Text + "'," + TB_Price.Text + ")";
        //這是傳統做法,但會有SQL Injection的風險

        string sql = "UPDATE 巨巨 SET 品名=@name,價錢=@price WHERE 產品編號=@id";
        //若是用java:"UPDATE 巨巨 SET 品名=?,價錢=? WHERE 產品編號=?";
        
        SqlCommand cmd = new SqlCommand(sql, conn);
        cmd.Parameters.Add("@id", SqlDbType.Int).Value = L_Id.Text;
        cmd.Parameters.Add("@name", SqlDbType.VarChar).Value = T_name.Text;
        cmd.Parameters.Add("@price", SqlDbType.Money).Value = T_price.Text;
        //找出對應的編號並給值
        //若是java,則是1,2,3接繼下去

        conn.Open();
        cmd.ExecuteNonQuery();
        cmd.Dispose();
        conn.Close();

        bs.ResetCurrentItem(); //重置現在的項目
    }
}

刪除按鈕:


private void button3_Click(object sender, EventArgs e)
{
    DialogResult ans = MessageBox.Show("確定刪除此筆資料?", "確定刪除", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
    if (ans == System.Windows.Forms.DialogResult.Yes)
    {
        SqlConnection conn = new SqlConnection("server=localhost;database=練練;UID=SQLAdmin;PWD=1234;");

        string sql = "DELETE 巨巨 WHERE 產品編號=@id";
        SqlCommand cmd = new SqlCommand(sql, conn);
        cmd.Parameters.Add("@id", SqlDbType.Int).Value = L_Id.Text;
        conn.Open();
        cmd.ExecuteNonQuery();
        cmd.Dispose();
        conn.Close();

        bs.RemoveCurrent(); //刪除此筆
    }
}

新增後,Form2的程式碼:


public partial class Form2 : Form
{
    private DataTable dt;
        
    public DataTable ProductList
    {
        set { this.dt = value; }
        get {return dt; }
    }

    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        DialogResult ans = MessageBox.Show("確定新增此筆資料?","確定新增", 
                               MessageBoxButtons.YesNo,MessageBoxIcon.Question);
        if (ans == System.Windows.Forms.DialogResult.Yes)
        {
            SqlConnection conn = new SqlConnection("server=localhost;database=練練;UID=SQLAdmin;PWD=1234;");

            //string sql = "INSERT INTO 巨巨 VALUES(" + TB_Id.Text + ",'" + TB_Name.Text + "'," + TB_Price.Text + ")";
            string sql = "INSERT INTO 巨巨 VALUES(@id,@name,@price);";
            SqlCommand cmd = new SqlCommand(sql,conn);
            cmd.Parameters.Add("@id", SqlDbType.Int).Value = TB_Id.Text;
            cmd.Parameters.Add("@name", SqlDbType.VarChar).Value = TB_Name.Text;
            cmd.Parameters.Add("@price", SqlDbType.Money).Value = TB_Price.Text;
            conn.Open();
            cmd.ExecuteNonQuery();
            cmd.Dispose();
            conn.Close();

            DataRow rr = dt.NewRow();
            rr[0] = int.Parse(TB_Id.Text);
            rr[1] = TB_Name.Text;
            rr[2] = double.Parse(TB_Price.Text);
            dt.Rows.Add(rr);//新增回去到主視窗的資料表
            this.Close();//關閉視窗

            /*要清空表單內容,並回到Id的TextBox
            TB_Id.Text = "";
            TB_Name.Text = "";
            TB_Price.Text = "";
            TB_Id.Focus(); //取回焦點
            */
        }                
    }
}

留言

熱門文章