LINQ 與資料存取:MVC 篇(2)- 透過ADO.NET讀取料

這一篇要透過 MVC 建立與 Web Form 相同的功能,針對關聯式資料庫進行資料查詢作業,如果對MVC不熟悉,請先參考第一次使用 MVC系列中的「第一次使用 MVC – 從控制器開始」開始與「第一次使用 MVC – 建立檢視頁面」,而這裏所使用的ADO.NET程式碼與相關的範例資料來源,請參考本系列的第一篇,現在假設你具備了所有相關的知識,這裏直接來看範例。

建立一個MVC專案MVC_ADONET,於其中的Models資料夾裏面,建立一個TCategoris.cs類別,提供資料來源如下:

namespace MVC_ADONET.Models
{
    public class TCategoris
    {
        public EnumerableRowCollection<DataRow>  GetProducts()
        {
            SqlConnection conn = new SqlConnection(
                            @"Server=Tim-PC;DataBase ");
            string sql =
"SELECT CategoryID,CategoryName,Description FROM Categories";
            DataSet ds = new DataSet();
            using (conn)
            {
                SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
                adapter.Fill(ds, "Categories");
            }
            EnumerableRowCollection<DataRow> table = ds.Tables[0].AsEnumerable();
            return table ;        
        }  
    }
}

這個類別中定義了 GetProducts() 函式,回傳自資料庫取得的 EnumerableRowCollection<DataRow> 資料物件,封裝所要查詢的資料內容。現在移至 Controllers資料夾,於其中新增一個控制器類別 CategoriesController.cs ,建立以下的程式碼:

namespace MVC_ADONET.Controllers
{
    public class CategoriesController : Controller
    {
        public ActionResult  Index()
        {
            Models.TCategoris c = new Models.TCategoris();
            IEnumerable<System.Data.DataRow> table =
from row in c.GetProducts()
select row;        
           ViewBag.Table = table;
           return View();        
        }
    }
}

其中的程式碼透過 Models.TCategoris() 取回資料,經由 LINQ 進一步萃取資料進行回傳,然後將封裝資料內容的 table 變數設定給 ViewBag 的 Table 。最後建立對應的 View 檔案 Index.cshtml ,配置如下的內容:

@{
    ViewBag.Title = "Index";
}
<h2>分類項目清單</h2>
<ul>     
    @{
        var table =(IEnumerable<System.Data.DataRow>) ViewBag.Table;
        foreach (System.Data.DataRow row in table)
        {
             <li><span><b>@row["CategoryID"]</b></span>
                 <span>@row["CategoryName"]</span>
                 <p>@row["Description"]</p>
             </li>
        }
    }        
</ul> 

其中透過 ViewBage.Table 取得控制器傳入的資料,並且將其轉換成為DataRow 型別的 IEnumerable 物件,緊接著於 foreach 迴圈中,將資料逐一取出。以下為此範例的執行結果:


如你所見,我們順利的透過ADO.NET將資料從Model層取出,然後透過View呈現,要注意的是,MVC比較好的作法是透過 Entity Framework 進行資料的存取操作,這一篇文章純粹是為了延續此系列的比較說明而寫的,請持續參考閱讀 第一次使用 MVC – 建立 Model(1)這一篇開始針對MVC+Entity Framework 的議題討論。

結束之前順便提醒一下, 在上面 View 的程式碼中,預先透過鑄型將 ViewBag.Table 取得的結果資料,轉型成為 IEnumerable<System.Data.DataRow> 以方便接下來的存取操作,這一部份只是為了示範而省略了實體類別的實作,如果你一定要在MVC中使用ADO.NET而非Entity Framework 這一類的資料模型框架,請參考LINQ 與資料存取 (3) - 透過 LINQ 轉換 DataSet 形成可序列化資料這一篇,建立自己的對應實體類別。


沒有留言: