用 DataSet 對(duì)象更新數(shù)據(jù)
發(fā)表時(shí)間:2024-01-21 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]這個(gè)是我新做的一個(gè)小站,宗旨為“beginner to beginner”,因?yàn)槲乙彩浅鯇W(xué)者:) 里面的“心得體會(huì)” 都是我自己寫的。大家知道,DataSet保存的數(shù)據(jù)是位于服務(wù)器內(nèi)存里面的原數(shù)據(jù)庫(kù)的“副本”。所以用DataSet更新數(shù)據(jù)的過程就是先對(duì)“副本”進(jìn)行更新,然后在將“原本”更新,按照我...
這個(gè)是我新做的一個(gè)小站,宗旨為“beginner to beginner”,因?yàn)槲乙彩浅鯇W(xué)者:) 里面的“心得體會(huì)” 都是我自己寫的。
大家知道,DataSet保存的數(shù)據(jù)是位于服務(wù)器內(nèi)存里面的原數(shù)據(jù)庫(kù)的“副本”。所以用DataSet更新數(shù)據(jù)的過程就是先對(duì)“副本”進(jìn)行更新,然后在將“原本”更新,按照我的理解就是把“原本”覆蓋掉。具體到過程,首先是要找到需要更新的行,然后賦新值,最后更新原數(shù)據(jù)庫(kù)。要找到需要修改的行,比較方便的做法就是根據(jù)記錄中的某個(gè)值進(jìn)行查找,這樣比用“列號(hào)”“行號(hào)”什么的方便多了。要做到這一點(diǎn),首先就是要給數(shù)據(jù)庫(kù)指定一個(gè)主鍵,然后即可按照主鍵進(jìn)行查找。要注意的是這個(gè)主鍵必須要是在程序中指定的,并且這個(gè)主鍵不一定和你數(shù)據(jù)庫(kù)原來有的主鍵一樣。然后就是最后的更新,當(dāng)然是用DataAdapter的Update()方法借助CommandBuilder來實(shí)現(xiàn),要注意的是,如果你的數(shù)據(jù)庫(kù)一開始沒有定義主鍵,那進(jìn)行更新的時(shí)候會(huì)出錯(cuò),返回的錯(cuò)誤將是“對(duì)于不返回任何鍵列信息的 SelectCommand 不支持 UpdateCommand 的動(dòng)態(tài) SQL 生成。”這是因?yàn)槲覀冇玫腢pdate()實(shí)際上是通過CommandBuilder動(dòng)態(tài)生成sql語(yǔ)句,然后才進(jìn)行的數(shù)據(jù)庫(kù)操作。但如果你在一開始創(chuàng)建DataAdapter時(shí)的那個(gè)sql語(yǔ)句沒有包含有主鍵的列的話,那CommandBuilder將不會(huì)發(fā)生作用。這一點(diǎn)是必須要牢記的。說了這么多,如果有不明白的就看下面的程序,這個(gè)是我練習(xí)時(shí)寫的,里面有一些個(gè)人的設(shè)定,比如記錄名什么的,相信大家一看就明白。代碼拷貝框
<%@import namespace="System.Data"%><%@import namespace="System.Data.OleDb"%><script language="c#" runat="server">//定義處理更新的方法//因?yàn)槭呛?jiǎn)單示例,所以這個(gè)程序已經(jīng)簡(jiǎn)化,直接進(jìn)行更新//這里有兩個(gè)參數(shù),第一個(gè)用來查找需要更新的行,第二個(gè)是要修改的值private void up_date(int ids,string names){//連接字符串,不明白的可以看本專題第二篇文章string connstr=ConfigurationSettings.AppSettings["color"];OleDbConnection conn=new OleDbConnection(connstr);string sql="select * from member";OleDbDataAdapter ada=new OleDbDataAdapter(sql,conn);//建立一個(gè)DataAdapter對(duì)象//這里的CommandBuilder對(duì)象一定不要忘了,一般就是寫在DataAdapter定義的后面OleDbCommandBuilder cb=new OleDbCommandBuilder(ada);DataSet ds=new DataSet();//建立DataSet對(duì)象conn.Open();//打開連接ada.Fill(ds,"mems");//填充DataSetconn.Close();//注意及時(shí)關(guān)閉連接DataTable dt=ds.Tables["mems"];//建立一個(gè)DataTable對(duì)象,方便操作dt.PrimaryKey=new DataColumn[]{dt.Columns["id"]};//建立一個(gè)主鍵DataRow dr=dt.Rows.Find(ids);//根據(jù)參數(shù)查找到需要修改的行dr["name"]=names;//對(duì)需要修改的記錄賦新值ada.Update(ds,"mems");//用DataAdapter的Update()方法進(jìn)行數(shù)據(jù)庫(kù)的更新}//定義用來響應(yīng)按鈕單擊事件的方法private void b1_Click(object sender,System.EventArgs e){if(Page.IsValid){int ids=Int32.Parse(idst.Text);//取得要修改的行的id值,并轉(zhuǎn)換成int類型string names=namest.Text;//取得新值up_date(ids,names);//調(diào)用我們定義的方法處理lb1.Text="ok!";</script><html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>用dataset更新記錄</title></head><body><asp:Label id="lb1" runat="server"/><form runat="server"><asp:TextBox id="idst" runat="server"/><asp:RequiredFieldValidator id="rfv1" ControlToValidate="idst" ErrorMessage="error!" runat="server"/><asp:TextBox id="namest" runat="server"/><asp:RequiredFieldValidator id="rfv2" ControlToValidate="namest" ErrorMessage="error!" runat="server"/><asp:Button id="b1" Text="here!!" OnClick="b1_Click" runat="server"/></form></body></html>
[Ctrl+A 全部選擇 然后拷貝]