恬然自得.活在當下: [實習]12/09 ASP.NET 使用C#上機課程

2010年12月25日 星期六

[實習]12/09 ASP.NET 使用C#上機課程


今天要來區分DataReaderDataSet的技術唷,而且老師當天不知為何──都是上網抓取別人的程式碼下來修改的,也許是想讓我們練習,從網路上找資源來使用的方法吧,畢竟不是要做什麼都有完整的範例,有時得到網路上找資料,拼拼湊湊出一個程式。

實習一:試利用ADO.NET DataReader技術,寫一ASP.NET C#程式,存取資料庫”mydb.mdb”中的grade資料表之內容。

大家可以先試試看,利用以下這兩個網址,來實作出DataReader,我想經過上個星期的課程,DataReader應該是難不倒大家的!!

如果大家做不出來的話,在下面會一步一步教大家改,建議還是做一遍唷,即使是看著說明做也要試看看,不然單純用看的可是會忘的。

打開第一個網頁吧,裡面的程式碼是不是很熟悉呢?請記得Import命名空間和Page_Load要分開複製唷。




接下來就要修改程式碼中,不符合我們需要的部分了。

第一個就是<%@ 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吧,那麼如果忘記他的格式怎麼辦呢?還記得之前有要寫providerdata source這兩個相當重要,卻又非常長的語法嗎?

進入第二個網址吧。

將這一段程式碼複製下來
dbconn= New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;data source=" & server.mappath("northwind.mdb"))

但是這看起來像VB的用法耶,所以請將它逐一修改吧。
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)

然後繼續檢查到,發現fillforeach裡面,資料表名稱都寫錯了唷,那是網站上的範例,請改成我們的資料表名稱”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

沒有留言:

張貼留言

歡迎提供良性建議^_^