在BETA2中,。NET提供了以下的NAMESPACE: System.Data Namespace System.Data.OleDb (和BETA1中已經(jīng)不同了,所以如果拿BETA1中的程序到BETA2中來運行肯定不可以的) 如果想講清楚這些東西,我不認為是我可以作到的,所以我想通過一些具體的程序來把我們對數(shù)據(jù)庫的最基本的操作(SELECT、UPDATE、DELETE、INSERT等)演示一下,其他的還是需要朋友們在學(xué)習(xí)過程中來慢慢體會了! 要想操作一個數(shù)據(jù)庫,不論是那種操作,首先要做的肯定是打開數(shù)據(jù)庫,下面我們以ACCESS數(shù)據(jù)庫來做例子說明如何打開一個數(shù)據(jù)庫連接!在這里我們需要用到的是:System.Data.OleDb.OleDbConnection類?。ㄈ绻僮鱏QL數(shù)據(jù)庫,我們最好使用System.Data.SqlClient.SqlConnection類) 我先寫出我自己使用的程序: using System.Data
using System.Data.OleDb public OleDbConnection getConn() { string connstr="Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=F:\\web\\notesbook\\class\\leavenotes.mdb"; OleDbConnection tempconn= new OleDbConnection(connstr); return(tempconn); } 相信只要使用過ADO的朋友應(yīng)該都可以看懂的!我們先定義一個String類型的變量,其中存放了我們連接數(shù)據(jù)庫的連接字符串,然后在定義一個System.Data.OleDb.OleDbConnection類型的對象并實例化,最后返回這個對象!需要說明一下的是,我并沒有把語句:tempconn.Open();放到這個函數(shù)中,原因我我稍后在說明,這里只是先提醒一下! 通過上面的函數(shù),我們就已經(jīng)得到了類似于ADO中的連接對象Connection了!下面的就是具體操作數(shù)據(jù)庫了! 在具體講操作前,我認為有必要先認識一下下面的兩個類: System.Data.OleDb.OleDbDataAdapter System.Data.OleDb.OleDbDataReader System.Data.OleDb.OleDbDataAdapter:可以直接和DataSet聯(lián)系,并操作數(shù)據(jù)源的,它的功能相對強大一些,因此也比較耗系統(tǒng)資源! System.Data.OleDb.OleDbDataReader:則有些類似于ADO中的哪個只讀向前的記錄集,它最常用在只需要依次讀取并顯示數(shù)據(jù)的時候,相比System.Data.OleDb.OleDbDataAdapter來說,他耗用的系統(tǒng)資源要??!其實,OleDbDataReader能實現(xiàn)的功能,OleDbDataAdapter都可以實現(xiàn),不過從資源使用率的角度考慮我們應(yīng)該盡量使用前者!但有些功能,卻是必須使用OleDbDataAdapter才可以實現(xiàn)的! * SELECT操作! 下面是我的自己在寫測試程序的時候用到了,先列出來看看OleDbDataReader和OleDbDataAdapter是如何操作從數(shù)據(jù)庫中選擇記錄的: //通過ID得到當(dāng)前留言詳細內(nèi)容.通過STRING類型參數(shù)
public Notebook getNoteFromID(string noteid) { Notebook tempnote=new Notebook(); //定義返回值 try { OleDbConnection conn = getConn(); //getConn():得到連接對象 string strCom = "Select * from notes where id=" + noteid ; OleDbCommand myCommand =new OleDbCommand(strCom,conn); conn.Open(); OleDbDataReader reader; reader =myCommand.ExecuteReader() ; //執(zhí)行command并得到相應(yīng)的DataReader //下面把得到的值賦給tempnote對象 if(reader.Read()) { tempnote.id=(int)reader["id"]; tempnote.title=reader["title"].ToString(); tempnote.content=reader["content"].ToString(); tempnote.author=reader["author"].ToString(); tempnote.email=reader["email"].ToString(); tempnote.http=reader["http"].ToString(); tempnote.pic=reader["pic"].ToString(); tempnote.hits=(int)reader["hits"]; tempnote.posttime=(DateTime)reader["posttime"]; } else //如沒有該記錄,則拋出一個錯誤! { throw(new Exception("當(dāng)前沒有該記錄!")); } reader.Close(); conn.Close(); } catch(Exception e) { //throw(new Exception("數(shù)據(jù)庫出錯:" + e.Message)) ; } return(tempnote); //返回Databook對象 } 上面的程序就是通過OleDbDataReader來得到特定的記錄的!其中用到的語句我單獨寫到下面: OleDbConnection conn = getConn(); //getConn():得到連接對象 string strCom = "Select * from notes where id=" + noteid ; //SQL語句 OleDbCommand myCommand =new OleDbCommand(strCom,conn); //建立OleDbCommand對象 conn.Open(); //注意我在前面說的Open語句在這里使用到了! OleDbDataReader reader; reader =myCommand.ExecuteReader() ; //執(zhí)行command并得到相應(yīng)的結(jié)果 我在每句話后都加入了說明,其中OleDbConnection conn = getConn();就是通過我前面提到的getConn函數(shù)來得到數(shù)據(jù)庫連接的,其他語句沒有什么好說的,都很簡單,就不多說了! 我再列一個通過OleDbDataAdapter來得到記錄的例程: //Getlist():得到當(dāng)前需要的留言列表
public DataView getNoteList() { DataView dataview; System.Data.DataSet mydataset; //定義DataSet try { OleDbConnection conn = getConn(); //getConn():得到連接對象 OleDbDataAdapter adapter = new OleDbDataAdapter(); string sqlstr="select * from notes order by posttime desc"; mydataset= new System.Data.DataSet(); adapter.SelectCommand = new OleDbCommand(sqlstr, conn); adapter.Fill(mydataset,"notes"); conn.Close(); } catch(Exception e) { throw(new Exception("數(shù)據(jù)庫出錯:" + e.Message)) ; } dataview = new DataView(mydataset.Tables["notes"]); return(dataview); } 這個程序或許有些復(fù)雜,同樣的,我還是先把那些關(guān)鍵語句列出,并說明: OleDbConnection conn = getConn(); //通過函數(shù)getConn()得到連接對象 OleDbDataAdapter adapter = new OleDbDataAdapter(); //實例化OleDbDataAdapter對象 string sqlstr="select * from notes order by posttime desc"; //SQL語句 mydataset= new System.Data.DataSet(); //由于OleDbDataAdapter需要和DataSet結(jié)合使用,所以在這里定義了DataSet對象,其實說OleDbDataAdapter復(fù)雜,其實就是因為DataSet的緣故DataSet有些類似于ADO中的recordset 對象,但功能遠遠超過了它,而且它和數(shù)據(jù)庫是斷開的,并能存放多個記錄集! adapter.SelectCommand = new OleDbCommand(sqlstr, conn); //設(shè)置命令為SelectCommand類型的 adapter.Fill(mydataset,"notes"); //執(zhí)行,并將結(jié)果添加到mydataset中的”notes”表中 conn.Close(); //關(guān)閉連接! 在對上面的程序加一些補充說明,由于getNoteLista是得到一系列記錄,并通過控件DataGrid來做分頁顯示的,所以我返回的是一個DataView類型的對象! ---------------------------------------- 上次說了如何在ADO。NET中執(zhí)行“SELECT”語句,這次我們看看,如何執(zhí)行“DELETE、UPDATE、INSERT”等語句。 我們這次同樣通過例子來看,其中我們用到了System.Data.OleDb.OleDbCommand類,其實,我們在前面執(zhí)行SELECT的時候也用到了! 下面我寫出我的程序: //修改留言本中特定的數(shù)據(jù)
public Boolean UpdateNote(Notebook note) { Boolean tempvalue=false; string sqlstr=""; //當(dāng)時在這里定義,是為了在出現(xiàn)異常的時候看看我的SQL語句是否正確 try { //用到了我前面寫的那個得到數(shù)據(jù)庫連接的函數(shù) OleDbConnection conn = getConn(); //getConn():得到連接對象, conn.Open(); //確定我們需要執(zhí)行的SQL語句,本處是UPDATE語句! sqlstr = "UPDATE notes SET "; sqlstr += "title='" + note.title + "',"; sqlstr += "content='" + DealString(note.content) +"',"; sqlstr += "author='" + note.author + "',"; sqlstr += "email='" +note.email +"',"; sqlstr += "http='" +note.http +"'"; //sqlstr += "pic='" +note.pic +"'"; sqlstr += " where id=" + note.id; //定義command對象,并執(zhí)行相應(yīng)的SQL語句 OleDbCommand myCommand = new OleDbCommand(sqlstr,conn); myCommand.ExecuteNonQuery(); //執(zhí)行SELECT的時候我們是用的ExecuteReader() conn.Close(); //假如執(zhí)行成功,則,返回TRUE,否則,返回FALSE tempvalue=true; return(tempvalue); } catch(Exception e) { throw(new Exception("數(shù)據(jù)庫更新出錯:" + sqlstr + "\r" + e.Message)) ; } } 這個例子是對于特定ID好的記錄進行UPDATE操作,具體解釋我都寫在了程序中,其中的與數(shù)據(jù)庫有關(guān)的語句是try內(nèi)部的那些! 其實,我們同樣可以通過上面的那種模式執(zhí)行INSERT、DELETE操作,下面我把我的程序列到下面! /*刪除特定記錄,通過string類型的ID刪除字段,在我的程序中,我把這個函數(shù)重載了,這樣我們就可以通過INT類型的ID參數(shù)來刪除特定的字段了*/ public Boolean DelNote(string delid)
{ Boolean tempvalue=false; string sqlstr=""; //連接數(shù)據(jù)庫 try { OleDbConnection conn = getConn(); //getConn():得到連接對象 conn.Open(); sqlstr = "delete * from notes where id=" + delid; //定義command對象,并執(zhí)行相應(yīng)的SQL語句 OleDbCommand myCommand = new OleDbCommand(sqlstr,conn); myCommand.ExecuteNonQuery(); conn.Close(); //假如執(zhí)行成功,則,返回TRUE,否則,返回FALSE tempvalue=true; return(tempvalue); } catch(Exception e) { throw(new Exception("數(shù)據(jù)庫更新出錯:" + sqlstr + "\r" + e.Message)) ; } } 細心的朋友們應(yīng)該能看到,其實這個程序和上面的相比,只是哪個SQL語句不同而已,其他的都基本一樣的!同樣的,我們想在數(shù)據(jù)庫中插入新的記錄的時候也可以用這樣的方式,程序如下: //向留言本中添加數(shù)據(jù) public Boolean AddNote(Notebook note)
{ Boolean tempvalue=false; //定義返回值,并設(shè)置初值 //下面把note中的數(shù)據(jù)添加到數(shù)據(jù)庫中! try{ OleDbConnection conn = getConn(); //getConn():得到連接對象 conn.Open(); //設(shè)置SQL語句 string insertstr="INSERT INTO notes(title, content, author, email, http, pic ,hits,posttime) VALUES ('"; insertstr += note.title +"', '"; insertstr += DealString(note.content) + "','"; insertstr += note.author + "','"; insertstr += note.email + "','"; insertstr += note.http + "','"; insertstr += note.pic + "',"; insertstr += note.hits + ",'"; insertstr += note.posttime +"')"; OleDbCommand insertcmd = new OleDbCommand(insertstr,conn) ; insertcmd.ExecuteNonQuery() ; conn.Close(); tempvalue=true; } catch(Exception e) { throw(new Exception("數(shù)據(jù)庫出錯:" + e.Message)) ; } return(tempvalue); } //處理數(shù)據(jù),在把數(shù)據(jù)存到數(shù)據(jù)庫前,先屏蔽那些危險字符! public string DealString(string str) { str=str.Replace("<","<"); str=str.Replace(">",">"); str=str.Replace("\r","<br>"); str=str.Replace("\'","’"); str=str.Replace("\x0020"," "); return(str); } //恢復(fù)數(shù)據(jù):把數(shù)據(jù)庫中的數(shù)據(jù),還原成未處理前的樣子 public string UnDealString(string str) { str=str.Replace("<","<"); str=str.Replace(">",">"); str=str.Replace("<br>","\r"); str=str.Replace("’","\'"); str=str.Replace(" ","\x0020"); return(str); } 我同時列出了兩個函數(shù)UnDealString()和DealString( ),他們是對與輸入內(nèi)容做一些事先的處理和還原工作的! 這幾個程序因為都比較簡單,所以我就不多說了! 其實,我這樣的對數(shù)據(jù)庫操作也只是ADO。NET中的一部分,而通過DataSet來操作我現(xiàn)在還沒有仔細研究過,所以我也不能寫出什么東西來,以后的這幾天我就準(zhǔn)備好好看看那個東西了,到時候,我還會把我的感受寫出來和大家分享! 在補充一下,我前面用到的程序都是我在寫一個留言本的測試程序時候用到的!如果有朋友有興趣的話,我將貼出我的全部學(xué)習(xí)代碼! -------------------------------------------------- 第三節(jié) 通過OleDbDataAdapte來操作數(shù)據(jù)庫! 呵呵,朋友好?。∮痔炝亮?,熬了一個晚上,現(xiàn)在頭腦已經(jīng)不是很清楚了,不過還不想休息!接著說說我們的數(shù)據(jù)庫操作吧!前面我們已經(jīng)說了如何操作數(shù)據(jù)庫,但幾乎全部是通過OleDbCommand和OleDbDataReader來做的,這次我們說說如何通過OleDbDataAdapter來操作數(shù)據(jù)庫!由于OleDbDataAdapter是DataSet和數(shù)據(jù)源之間建立聯(lián)系的一個橋梁,而DataSet我想大家都知道在ADO.NET中所占的地位,所以知道如何通過它來操作數(shù)據(jù)庫就是必須的了! 好了,不廢話了!在前面我們已經(jīng)用到過一次OleDbDataAdapter來執(zhí)行“SELECT”語句,我門在回憶一次看看那段代碼!(我適當(dāng)簡化了) OleDbConnection conn = getConn(); //getConn():得到連接對象 OleDbDataAdapter adapter = new OleDbDataAdapter("select * from notes order by posttime desc",conn); System.Data.DataSet mydataset = new System.Data.DataSet();; //定義DataSet adapter.Fill(mydataset,"notes"); conn.Close(); 整個過程分以下幾步: 1. 建立數(shù)據(jù)庫連接(我是通過自己的函數(shù),在前面的文章中有代碼) 2. 實例化OleDbDataAdapter對象! 3. 建立一個DataSet對象,執(zhí)行SQL語句得到的表添加到其中 4. 關(guān)閉數(shù)據(jù)庫連接 通過上面的步驟我們就可以使用DataBind將我們得到的數(shù)據(jù)綁定到特定的控件上了! 下面我們看看,如何通過OleDbDataAdapter來執(zhí)行刪除特定的數(shù)據(jù)庫記錄?。―ELETE) 由于執(zhí)行刪除、修改、添加都比前面的麻煩,所以我們還是先看例程,然后自己體會一下,程序如下: //刪除特定記錄,通過string類型的ID刪除字段
public Boolean DelNote(string delid) { Boolean tempvalue=false; //連接數(shù)據(jù)庫 try { OleDbConnection conn = getConn(); //getConn():得到連接對象 string selectstr = "select * from notes where id=" + delid; OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(selectstr,conn); //建立OleDbCommandBuilder,必須! OleDbCommandBuilder mybuilder = new OleDbCommandBuilder(myDataAdapter); DataSet ds = new DataSet(); //建立DataSet()實例 myDataAdapter.Fill(ds,"notes"); //下面的可以簡化,由于我開始是選擇了所有的記錄,所以就用的是集合方式 foreach(DataRow dr in ds.Tables["notes"].Rows) { if(dr["id"].ToString().Equals(delid)) { dr.Delete(); } } myDataAdapter.Update(ds,"notes"); //假如執(zhí)行成功,則,返回TRUE,否則,返回FALSE conn.Close(); tempvalue=true; return(tempvalue); } catch(Exception e) { throw(new Exception("數(shù)據(jù)庫刪除出錯:" + e.Message)) ; } } 這個程序和我們前面用到的刪除例程是執(zhí)行同樣的功能的,我這里改成了用myDataAdapter來達到同樣的效果! 要通過myDataAdapter執(zhí)行delete操作,我們要有下面的幾步: 1. 建立數(shù)據(jù)庫連接(通過:OleDbConnection conn = getConn();) 2. 實例化OleDbDataAdapter對象!此處并沒有用delete語句,而是先用select語句把要刪除的記錄取得 3. 建立一個DataSet對象,并把執(zhí)行select語句得到的記錄添加到其中 4. 建立OleDbCommandBuilder對象! 并讓它與我們前面的OleDbDataAdapter對象關(guān)聯(lián)!語句如下:OleDbCommandBuilder mybuilder = new OleDbCommandBuilder(myDataAdapter); 5. 刪除DataSet中包含表的特定記錄 6. 執(zhí)行OleDbDataAdapter對象的Update命令更新數(shù)據(jù)庫,語句如下: myDataAdapter.Update(ds,"notes"); 7. 關(guān)閉數(shù)據(jù)庫連接 上面步驟中的第4步,我們建立了一個OleDbCommandBuilder對象,注意是必須的!??!我們將它和OleDbDataAdapter關(guān)聯(lián)起來,監(jiān)視RowUpdating事件的發(fā)生!在我們刪除了指定的記錄后,要通過執(zhí)行OleDbDataAdapter對象的Update命令來更新數(shù)據(jù)庫! 其實,上面的結(jié)構(gòu)不僅適合與delete操作,同樣適合insert、update操作的,只要我們把上面的第5步改成相應(yīng)的操作語句就可以的! 備注: 在ms自帶的幫助中,它是使用下面的方式: string mySelectText = "SELECT * FROM Categories ORDER BY CategoryID"; string mySelectConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=NWIND_RW.MDB"; OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(mySelectText,mySelectConn); myDataAdapter.DeleteCommand.CommandText="DELETE FROM Categories WHERE CategoryName='Produce'"; myDataAdapter.DeleteCommand.Connection = myDataAdapter.SelectCommand.Connection; |
|