天天看點

.NET零基礎入門10:打老鼠之資料存儲

一:資料庫設計

到此為止,打老鼠遊戲還不能儲存每次遊戲的成績,我們今天完成的任務就是要存儲成績到SQLSERVER的資料庫中。

在上節課中,我們已經知道了如何建立資料庫,所有,先建立資料庫“MouseGame”,然後,按如下的資料格式建立一個資料表(表名:GameRecord):

.NET零基礎入門10:打老鼠之資料存儲

二:資料庫讀寫

資料庫的讀寫部分,請檢視下節視訊。最終,我們的成績檢視界面如下:

.NET零基礎入門10:打老鼠之資料存儲

三:視訊

四:将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,如需轉載請自行聯系原作者