C#連接數(shù)據(jù)庫(kù)和更新數(shù)據(jù)庫(kù)的方法
對(duì)數(shù)據(jù)庫(kù)的操作總體可以分為兩類:查詢(select)和更新(insert,delete,update)。為什么這樣來(lái)分呢?仔細(xì)看看兩類的區(qū)別,select只是從數(shù)據(jù)庫(kù)中將數(shù)據(jù)拿出來(lái)使用,而其余三者都會(huì)對(duì)數(shù)據(jù)庫(kù)的物理數(shù)據(jù)進(jìn)行修改。這篇文章將接著闡述更新數(shù)據(jù)。
更新數(shù)據(jù)庫(kù)信息首先是連接數(shù)據(jù)庫(kù),對(duì)數(shù)據(jù)庫(kù)的更新需要一個(gè)對(duì)象:OleDbCommand。該對(duì)象表示要對(duì)數(shù)據(jù)源執(zhí)行的SQL語(yǔ)句或存儲(chǔ)過(guò)程。
這個(gè)對(duì)象有三個(gè)屬性:1、CommandText表示要設(shè)置命令的文本;2、Connection表示要設(shè)置命令的連接;3、CommandType表示設(shè)置命令的類型,默認(rèn)的是Sql語(yǔ)句(但如果不是執(zhí)行sql語(yǔ)句,就一定要指定命令的類型)。OleDbCommand對(duì)象設(shè)置好以后,就該執(zhí)行sql語(yǔ)句了。方法ExecuteNonQuery()就是執(zhí)行sql語(yǔ)句。如果記不住這個(gè)方法,教你一個(gè)簡(jiǎn)單的記法:將“ExecuteNonQuery”單詞分為三部分,就是“執(zhí)行不查詢”,那就是更新數(shù)據(jù)了。
下面就做一個(gè)例子熟悉對(duì)數(shù)據(jù)庫(kù)的更新:
先使用Visual Studio2005做出如下界面:
界面做好以后就相當(dāng)于做了一個(gè)空殼子。接下來(lái)就是往里邊添加事件了。我們還要借用上篇文章中的ConnDb類,在該類里添加一個(gè)方法:update()對(duì)數(shù)據(jù)庫(kù)進(jìn)行更新,該方法里有一個(gè)參數(shù)string sql。
public class ConnDb { OleDbConnection conn = null;//連接數(shù)據(jù)庫(kù)的對(duì)象 //下面是構(gòu)造函數(shù)連接數(shù)據(jù)庫(kù) public ConnDb() { if (conn==null)//判斷連接是否為空 { conn = new OleDbConnection(); conn.ConnectionString="provider=sqloledb.1;data source=.;initial catalog=capucivar;user id=sa;pwd=";//連接數(shù)據(jù)庫(kù)的字符串 } if (conn.State == ConnectionState.Closed) { conn.Open();//打開(kāi)數(shù)據(jù)庫(kù)連接 } } //下面這個(gè)方法是從數(shù)據(jù)庫(kù)中查找數(shù)據(jù)的方法 public DataSet query(string sql) { DataSet ds = new DataSet();//DataSet是表的集合 OleDbDataAdapter da = new OleDbDataAdapter(sql,conn);//從數(shù)據(jù)庫(kù)中查詢 da.Fill(ds);//將數(shù)據(jù)填充到DataSet connClose();//關(guān)閉連接 return ds;//返回結(jié)果 } //下面的方法是對(duì)數(shù)據(jù)庫(kù)進(jìn)行更新 public int update(string sql) {OleDbCommand oc = new OleDbCommand();//表示要對(duì)數(shù)據(jù)源執(zhí)行的SQL語(yǔ)句或存儲(chǔ)過(guò)程 oc.CommandText = sql;//設(shè)置命令的文本 oc.CommandType = CommandType.Text;//設(shè)置命令的類型 oc.Connection = conn;//設(shè)置命令的連接 int x=oc.ExecuteNonQuery();//執(zhí)行SQL語(yǔ)句 connClose();//關(guān)閉連接 return x; //返回一個(gè)影響行數(shù) } //下面的connClose()方法是關(guān)閉數(shù)據(jù)庫(kù)連接 public void connClose() { if (conn.State == ConnectionState.Open) {//判斷數(shù)據(jù)庫(kù)的連接狀態(tài),如果狀態(tài)是打開(kāi)的話就將它關(guān)閉 conn.Close(); } } }
對(duì)數(shù)據(jù)庫(kù)的操作類寫(xiě)好了。然后就來(lái)實(shí)現(xiàn)增刪改的功能:
理一下思路,先添加一個(gè)用戶,如何編寫(xiě)代碼:1、得到客戶所填的數(shù)據(jù)(用戶名和密碼);2、編寫(xiě)insert語(yǔ)句,將用戶信息通過(guò)ConnDb()類添加到數(shù)據(jù)庫(kù)中;3、返回一個(gè)影響行數(shù)以便通知客戶執(zhí)行是否成功。代碼如下:
private void add_but_Click(object sender, EventArgs e) {//按鈕單擊事件 //得到用戶所填的用戶名和密碼 string uname = this.uname_text.Text; string upass = this.upass_text.Text; string sql = string.Format("insert into users values('{0}','{1}')",uname,upass);//拼寫(xiě)sql語(yǔ)句將該用戶信息插入到數(shù)據(jù)庫(kù)中 int x = new Db.ConnDb().update(sql);//通過(guò)ConnDb()對(duì)象的update()方法執(zhí)行sql語(yǔ)句并返回一個(gè)影響行數(shù) if (x > 0) {//如果影響行數(shù)大于0則說(shuō)明插入成功,否則的話插入失敗 MessageBox.Show("添加成功!"); } else { MessageBox.Show("添加失敗!"); } }
添加一個(gè)用戶之后,在右邊的listBox中顯示出來(lái):
public void refurbish() { string sql = "select * from users";//sql語(yǔ)句查詢數(shù)據(jù) DataSet ds = new Db.ConnDb().query(sql);//查詢返回一個(gè)DataSet this.listBox1.DisplayMember = "username";//listBox中要顯示的列 this.listBox1.DataSource=ds.Tables[0];// listBox的數(shù)據(jù)源 }
執(zhí)行結(jié)果如下:
而當(dāng)客戶選中右邊的listBox中的一個(gè)選項(xiàng)時(shí),可以進(jìn)行相應(yīng)的刪除或修改。刪除的代碼如下:
private void del_but_Click(object sender, EventArgs e) {string uname = this.listBox1.Text;//得到listBox中所選的值 string sql = string.Format("delete from users where username='{0}'",uname);//拼寫(xiě)sql語(yǔ)句刪除用戶 int x = new Db.ConnDb().update(sql);//調(diào)用update()方法返回影響行數(shù) if (x > 0) {//根據(jù)返回的影響行數(shù)判斷刪除是否成功 MessageBox.Show("刪除成功!"); } else{ MessageBox.Show("刪除失敗!"); } }
刪除之后的結(jié)果如下:
在點(diǎn)擊“更新”按鈕之后,應(yīng)該彈出一個(gè)窗口顯示客戶所選用戶的信息供客戶更新。更新的代碼如下:
private void upa_but_Click(object sender, EventArgs e) { string uname = this.listBox1.Text;//得到listBox中所選的用戶信息 new upd(uname).ShowDialog();//彈出要更新窗口upd.cs } upd.cs的代碼如下: public partial class upd : Form { public upd()//無(wú)參構(gòu)造函數(shù) { InitializeComponent(); } public upd(string uname)//有參構(gòu)造函數(shù) { InitializeComponent(); this.uname_text.Text = uname;//將用戶名放到文本框 string sql = string.Format("select * from users where username='{0}'", uname);//拼寫(xiě)sql語(yǔ)句通過(guò)用戶名查找用戶的信息 DataSet ds = new Db.ConnDb().query(sql); //下面得到結(jié)果集中的信息分別放至相應(yīng)文本框中 this.uid_text.Text = ds.Tables[0].Rows[0][0].ToString(); this.upass_text.Text = ds.Tables[0].Rows[0][2].ToString(); } private void button1_Click(object sender, EventArgs e)//點(diǎn)擊“確認(rèn)修改”按鈕所響應(yīng)的事件 {int uid = Convert.ToInt32(this.uid_text.Text);//得到uid string uname = this.uname_text.Text;//得到用戶名 string upass = this.upass_text.Text;//得到用戶密碼 string sql = string.Format("update users set username='{0}',userpass='{1}' where uid={2}",uname,upass,uid);//拼寫(xiě)一個(gè)修改sql語(yǔ)句 int x = new Db.ConnDb().update(sql);//返回所受影響行數(shù) if (x > 0) {//根據(jù)影響行數(shù)判斷修改是否成功 MessageBox.Show("修改成功!"); this.Visible = false;//將該頁(yè)面隱藏 } else { MessageBox.Show("修改失??!"); return; } } private void button2_Click(object sender, EventArgs e){//點(diǎn)擊“取消”按鈕所響應(yīng)的事件 this.Visible = false;//將該頁(yè)面隱藏 } }}
修改的結(jié)果如下:
在每次對(duì)數(shù)據(jù)庫(kù)進(jìn)行修改之后,界面右邊的listBox中的數(shù)據(jù)就會(huì)更新一次,所以每次對(duì)數(shù)據(jù)庫(kù)操作之后都應(yīng)該調(diào)用refurbish()方法。一個(gè)簡(jiǎn)單的使用C#對(duì)數(shù)據(jù)庫(kù)進(jìn)行增刪改查的代碼就寫(xiě)完了。
代碼寫(xiě)的很簡(jiǎn)單,只是完成了最簡(jiǎn)單的增刪改查功能,大家可以動(dòng)手操作將上述的代碼更加完善!
- C# Winform自動(dòng)更新程序?qū)嵗斀?/a>
- c# Winform 程序自動(dòng)更新實(shí)現(xiàn)方法
- asp.net(c#)程序版本升級(jí)更新的實(shí)現(xiàn)代碼
- C# protobuf自動(dòng)更新cs文件
- C#如何讀取Txt大數(shù)據(jù)并更新到數(shù)據(jù)庫(kù)詳解
- c#中Winform實(shí)現(xiàn)多線程異步更新UI(進(jìn)度及狀態(tài)信息)
- C#微信公眾平臺(tái)開(kāi)發(fā)之a(chǎn)ccess_token的獲取存儲(chǔ)與更新
- C#在子線程中更新窗口部件的寫(xiě)法
- C#批量更新sql實(shí)例
- 用c# 自動(dòng)更新程序
相關(guān)文章
C#設(shè)計(jì)模式之觀察者模式實(shí)例講解
這篇文章主要介紹了C#設(shè)計(jì)模式之觀察者模式實(shí)例講解,本文詳細(xì)講解了觀察者模式的定義、優(yōu)缺點(diǎn)、代碼實(shí)例等,需要的朋友可以參考下2014-10-10C#.NET中如何批量插入大量數(shù)據(jù)到數(shù)據(jù)庫(kù)中
這篇文章主要給大家介紹C#.net中如何批量插入大量數(shù)據(jù)到數(shù)據(jù)庫(kù)中,本文涉及到C#.net中批量插入數(shù)據(jù)到數(shù)據(jù)庫(kù)中方面的內(nèi)容,對(duì)C#.net批量插入數(shù)據(jù)到數(shù)據(jù)庫(kù)中感興趣的朋友可以參考下本篇文章2015-10-10C#實(shí)現(xiàn)文件壓縮與解壓的方法示例【ZIP格式】
這篇文章主要介紹了C#實(shí)現(xiàn)文件壓縮與解壓的方法,結(jié)合具體實(shí)例形式分析了C#針對(duì)文件進(jìn)行zip格式壓縮與解壓縮的相關(guān)操作技巧,需要的朋友可以參考下2017-06-06C#數(shù)據(jù)結(jié)構(gòu)之堆棧(Stack)實(shí)例詳解
這篇文章主要介紹了C#數(shù)據(jù)結(jié)構(gòu)之堆棧(Stack),結(jié)合實(shí)例形式較為詳細(xì)的分析了堆棧的原理與C#實(shí)現(xiàn)堆棧功能的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11C#中調(diào)用Windows API的技術(shù)要點(diǎn)說(shuō)明
本篇文章主要是對(duì)C#中調(diào)用Windows API的技術(shù)要點(diǎn)進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-01-01C#動(dòng)態(tài)創(chuàng)建Access數(shù)據(jù)庫(kù)及密碼的方法
同為微軟的產(chǎn)品,本文將討論的是C#如何創(chuàng)建Access數(shù)據(jù)庫(kù),同時(shí)創(chuàng)建數(shù)據(jù)庫(kù)密碼與相關(guān)操作,希望對(duì)大家有所幫助。2015-09-09