一:資料庫設計
到此為止,打老鼠遊戲還不能儲存每次遊戲的成績,我們今天完成的任務就是要存儲成績到SQLSERVER的資料庫中。
在上節課中,我們已經知道了如何建立資料庫,所有,先建立資料庫“MouseGame”,然後,按如下的資料格式建立一個資料表(表名:GameRecord):
二:資料庫讀寫
資料庫的讀寫部分,請檢視下節視訊。最終,我們的成績檢視界面如下:
三:視訊
四:将DataRow轉換成Model
在上面的視訊中,我們的資料庫直接以Datatable的形式指派給了前台(UI)。在實際的應用的當中,尤其是多層架構的應用當中,我們更常用的做法是将資料庫記錄以List<Model>(還記得List<Model>這個形式嗎?我們的前台UI的Code-behind代碼中,我們存儲老鼠控件,用了List<PictureBox>)的形式在前背景中間進行傳遞,即:
下面的代碼:
public DataTable GetList()
{
string sql = "select * from GameRecord";
return this.GetTable(sql);
}
最好變成:
public List<GameRecord> GetRecordList()
return DatatableHelper.ToList<GameRecord>(this.GetList());
GameRecord是什麼?就是我們的遊戲記錄的實體類,它的實作如下:
public class GameRecord
#region Public Properties
public DateTime GameDateTime { get; set; }
public int GameLevel { get; set; }
public int Score { get; set; }
public int Total { get; set; }
#endregion
在上面的代碼中,DatatableHelper的實作如下:
namespace GameSqlserverDal
using System;
using System.Collections.Generic;
using System.Data;
using System.Reflection;
internal class DatatableHelper
{
#region Public Methods and Operators
public static DataTable ToDataTable<T>(IEnumerable<T> list)
{
var pList = new List<PropertyInfo>();
Type type = typeof(T);
var dt = new DataTable();
Array.ForEach(
type.GetProperties(),
p =>
{
pList.Add(p);
dt.Columns.Add(p.Name, p.PropertyType);
});
foreach (T item in list)
{
DataRow row = dt.NewRow();
pList.ForEach(p => row[p.Name] = p.GetValue(item, null));
dt.Rows.Add(row);
}
return dt;
}
public static List<T> ToList<T>(DataTable dt) where T : class, new()
var prlist = new List<PropertyInfo>();
if (dt.Columns.IndexOf(p.Name) != -1)
{
prlist.Add(p);
}
var oblist = new List<T>();
foreach (DataRow row in dt.Rows)
var ob = new T();
prlist.ForEach(
p =>
if (row[p.Name] != DBNull.Value)
{
p.SetValue(ob, row[p.Name], null);
}
});
oblist.Add(ob);
return oblist;
#endregion
}
以我們目前的知識儲備能力,我們還不能很好的了解上面這個幫助類的代碼,但是沒有關系,雖然我們目前寫不出這個代碼,但是我們一定要會用。就像我們寫不出.NET Famework的API,但是我們會用好它,也是一種能力。現在,重構我們的代碼,用List<GameRecord>來給我們的UI進行指派吧。
本文轉自最課程陸敏技部落格園部落格,原文連結:http://www.cnblogs.com/luminji/p/4401797.html,如需轉載請自行聯系原作者