今天要來區分DataReader和DataSet的技術唷,而且老師當天不知為何──”都是上網抓取別人的程式碼下來修改的,也許是想讓我們練習,從網路上找資源來使用的方法吧,畢竟不是要做什麼都有完整的範例,有時得到網路上找資料,拼拼湊湊出一個程式。
實習一:試利用ADO.NET DataReader技術,寫一ASP.NET C#程式,存取資料庫”mydb.mdb”中的grade資料表之內容。
大家可以先試試看,利用以下這兩個網址,來實作出DataReader,我想經過上個星期的課程,DataReader應該是難不倒大家的!!
如果大家做不出來的話,在下面會一步一步教大家改,建議還是做一遍唷,即使是看著說明做也要試看看,不然單純用看的可是會忘的。
接下來就要修改程式碼中,不符合我們需要的部分了。
第一個就是<%@ Import Namespace="System.Data.SqlClient" %>
請改成<%@ Import Namespace="System.Data.OleDb" %>,因為我們的範例用的是Access的資料庫,不是SQL。
然後有寫著Sql的部分,請改為OleDb唷,這才是操作Access資料庫的用法。
然後這段程式碼
myConnection = new SqlConnection(ConfigurationSettings.AppSettings["strConn"]);
myConnection.Open();
他的用法也是屬於SQL,請改成我們熟悉的OleDb吧,那麼如果忘記他的格式怎麼辦呢?還記得之前有要寫provider和data source這兩個相當重要,卻又非常長的語法嗎?
進入第二個網址吧。
將這一段程式碼複製下來
dbconn= New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;data source=" & server.mappath("northwind.mdb"))
1. 先將變數改成剛剛在用的myConnection
2. New請改成new
3. &字號必須改成+字號
4. server.mappath必須要區分大小寫,改成Server.MapPath
5. 然後檔案名稱改成我們的名稱"mydb.mdb"
6. 最後,就是加上最重要的分號 ; 嘍
改完之後,就變成這個樣子
myConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;data source=" + Server.MapPath("mydb.mdb"));
這就是老師說的C語言(Copy Language),要多練習找資料,並且修改程式的技巧唷。
myCommand = new SqlCommand("SELECT TOP 10 * FROM EMPLOYEE", myConnection);
最後一個是命令的部分,記得將new SqlCommand改成new OleDbCommand
而SQL命令我們只是要將grade資料寫出,所以用"Select * from grade"
myCommand = new OleDbCommand("Select * from grade", myConnection);
之後就大功告成啦!
最後這段大家可以不用去變更,它是while然後使用DataReader來顯示資料庫內容。就請大家自己慢慢去改吧,會比較有映像的。
while (myDataReader.Read())
{
Response.Write(myDataReader["sno"]);
//Spacing
Response.Write(" ");
Response.Write(myDataReader["name"]);
//Spacing
Response.Write(" ");
Response.Write(myDataReader["chi"]);
//New Line
Response.Write("
");
");
}
//cleanup objects
myDataReader.Close();
myConnection.Close();
實習二:承實習一,但改用DataSet技術。
同樣也請大家用上述網址,來試著自己改看看唷,之後下面是替大家打的說明。
請大家複製實習一的程式碼,另外開一個檔案貼上。
之後就來修改裡面的內容吧,原本DataReader的部分要改為DataSet程式碼。
找到網站中,有寫DataSet部分的程式碼,然後複製需要的下來。
DataSet myDataSet = new DataSet();
OleDbCommand CommandObject = new OleDbCommand ("Select * from employee");
OleDbAdapter myDataAdapter = new OleDbAdapter (CommandObject, con);
myDataAdapter.Fill (myDataSet, "EmployeeData");
首先,OleDbAdapter myDataAdapter = new OleDbAdapter (CommandObject, con);
其中的con是網站上自訂義的指令,我們就改回myConnection吧
然後是這一段
OleDbCommand CommandObject = new OleDbCommand ("Select * from employee");
OleDbAdapter myDataAdapter = new OleDbAdapter (CommandObject, myConnection);
又宣告了一個command,如果覺得多寫一行很長的話,也可以把它放在一起,因為範例只用了簡單的SQL命令,所以放在一起也無大礙,如果是比較複雜 (又臭又長),建議宣告一個變數來放也不錯。
然後,命令的部分也有錯誤,請改成grade吧,因為我們的”mydb.mdb”裡的資料表就叫grade
圖片中箭頭指著的那行,就可以刪掉嘍。
所以程式碼改成如下:
myCommand = new OleDbCommand("Select * from grade", myConnection);
接著來讀取資料表內容,然後顯示出來吧!!原本是使用while來做Read,但DataSet是透過DataAdapter物件方法,將記錄的資料填入DataSet物件。
myDataAdapter.Fill(myDataSet, "EmployeeData");
Fill指令,會將grade資料表的內容,填入到一個新建的DataTable物件(長的就像是陣列)
所以,就可以使用別名來取得DataTable物件,然後用foreach迴圈取出DataTable物件的Rows屬性的每一個DataRow物件。好抽象的講法-”-。簡單來說,Rows就是DataTable的列,Columns就是行。
把程式碼的while改成foreach吧,直接貼上網站上的程式碼即可。
while (myDataReader.Read())
foreach (DataRow dr in myDataSet.Tables["EmployeeData"].Rows)
然後繼續檢查到,發現fill和foreach裡面,資料表名稱都寫錯了唷,那是網站上的範例,請改成我們的資料表名稱”grade”吧。
之後接著檢查foreach迴圈的內容,原本myDataReader變數已經改掉了,請把它們改成dr吧。
原先的Response.Write(myDataReader["sno"]);
改成這樣Response.Write(dr["sno"]);
這行是DataReader用的,也請刪掉它吧。
myDataReader = myCommand.ExecuteReader();
接下來就試看看有沒有成功吧!?
疑???阿,有個地方沒改到,而且這個地方是網站上面少打了。
這一段OleDbDAdapter myDataAdapter = new OleDbAdapter("Select * from grade", myConnection);
指令打錯了,應該是OleDbDataAdapter,而不是OleDbDAdapter唷,網站上的範例少打了Data。
將錯誤都改掉之後,就可以再來編譯看看嘍!
成功了!!! 也恭喜你看到了本篇文章的最後XD
過程雖然非常的繁雜,但做起來還是會發現它的有趣之處,況且打文章要花更多的時間XD
沒有留言:
張貼留言
歡迎提供良性建議^_^