C# 實作SQLServer資料庫範例
主旨:
實做資料庫的四個基本操作
INSERT、UPDATE、DELETE、SELECT
這邊會做到一種很屌的東西叫「藕合」
抽像到不行,建議看一下維基百科
用比喻是像離合器的東西,構連引擎及輪胎間的動力傳輸
這裡會用到一個叫BindingSource類別,它就像中間離合器
好的程式會是鬆散藕合,要進行修改相當容易
以下是預期會呈現的結果:
按下其中的「新增」按鈕會跳出視窗後輸入完新增回去
不可調整大小,沒有最大及最小的按扭:
大致如此。
說明:
第2個視窗的設定比較好說,先新增一個視窗Form2.cs
並在其中元件屬性設為以下的設定:
FormBorderStyle 設為.Fixed3D;
MaximizeBox = false
MinimizeBox = false
顯示目前筆數及選取狀態
實做資料庫的四個基本操作
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(); //取回焦點 */ } } }
留言
張貼留言