• C# 培训之零基础入门 10:打老鼠之数据存储


    到此为止,打老鼠游戏还不能保存每次游戏的成绩,我们今天完成的任务就是要存储成绩到SQLSERVER的数据库中。

    一:数据库设计

    在上节课中,我们已经知道了如何创建数据库,所有,先创建数据库“MouseGame”,然后,按如下的数据格式建立一个数据表(表名:GameRecord):

    image

    二:数据库读写

    数据库的读写部分,请查看视频:

    Lesson10.wmv(我已在线发送给你);

    备注:本文是课程《.NET C# 零基础入门》的免费部分,详细请参见TMJ .NET在线培训

    最终,我们的成绩查看界面如下:

    image

    三:将DataRow转换成Model,将DataTable转换成List<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>();
                Type type = typeof(T);
                Array.ForEach(
                    type.GetProperties(),
                    p =>
                        {
                            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进行 赋值吧。

    本章知识点:

    1:通过C#进行数据库读写;

    2:三层架构(概念性介绍);

    3:Datatable及List<T>转换;

    --------------------------------------

    欢迎您,进入 我系程序猿 的cnBlog博客。

    你不能改变你的过去,但你可以让你的未来变得更美好。一旦时间浪费了,生命就浪费了。

    You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.

    --------------------------------------

    分享到QQ空间  

  • 相关阅读:
    从原理上理解NodeJS的适用场景
    core 基本操作
    SQL Server 触发器
    Centos 7 Apache .netcore 做转发
    Windows Server 使用 WAMP 并配置 Https
    centos7 apache php git pull
    Visual StudioTools for Unity 使用技巧2
    如何实现Windows Phone代码与Unity相互通信(直接调用)
    关于NGUI与原生2D混用相互遮盖的问题心得
    关于NGUI制作图集在低内存设备上的注意事项
  • 原文地址:https://www.cnblogs.com/jqmtony/p/2910845.html
Copyright © 2020-2023  润新知