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(); //取回焦點
*/
}
}
}



留言
張貼留言