.NET零基础入门10:打老鼠之数据存储
一:数据库设计
到此为止,打老鼠游戏还不能保存每次游戏的成绩,我们今天完成的任务就是要存储成绩到SQLSERVER的数据库中。
在上节课中,我们已经知道了如何创建数据库,所有,先创建数据库“MouseGame”,然后,按如下的数据格式建立一个数据表(表名:GameRecord):
二:数据库读写
数据库的读写部分,请查看下节视频。最终,我们的成绩查看界面如下:
三:视频
非公开部分,请联系最课程(www.zuikc.com)
四:将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>();
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进行赋值吧。
.NET零基础入门10:打老鼠之数据存储的更多相关文章
- 048 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 10 案例——阶乘的累加和
		
048 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 10 案例--阶乘的累加和 本文知识点:通过案例练习嵌套循环应用 案例练习--阶乘的累加和 案例题目 ...
 - 030 01 Android 零基础入门  01 Java基础语法 03 Java运算符 10 条件运算符
		
030 01 Android 零基础入门 01 Java基础语法 03 Java运算符 10 条件运算符 本文知识点:Java中的条件运算符 条件运算符是Java当中唯一一个三目运算符 什么是三目运算 ...
 - 016 01 Android 零基础入门  01 Java基础语法 02 Java常量与变量 10 布尔类型和字符串的字面值
		
016 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 10 布尔类型和字符串的字面值 本文知识点:字面值 关于字面值的概念,需要注意:很多地方,我们可能就把字面值 ...
 - .NET零基础入门09:SQL必知必会
		
一:前言 仿佛到了更进一步的时候了,每一个程序员迟早都会遇到数据存储的问题.我们拿什么来存储程序产生的数据?举例来说,用什么来存储我们的打老鼠游戏每次的成绩呢?选择如下: 1:内存中.缺点,退出游戏, ...
 - 从零基础入门JavaScript(1)
		
从零基础入门JavaScript(1) 1.1 Javascript的简史 1995年的时候 由网景公司开发的,当时的名字叫livescript 为了推广自己的livescript,搭了j ...
 - Cloudera Manager、CDH零基础入门、线路指导 http://www.aboutyun.com/thread-9219-1-1.html (出处: about云开发)
		
Cloudera Manager.CDH零基础入门.线路指导http://www.aboutyun.com/thread-9219-1-1.html(出处: about云开发) 问题导读:1.什么是c ...
 - 【JAVA零基础入门系列】Day4 变量与常量
		
这一篇主要讲解Java中的变量,什么是变量,变量的作用以及如何声明,使用变量. 那么什么是变量?对于初学者而言,可以将变量理解为盒子,这些盒子可以用来存放数据,不同类型的数据需要放在对应类型的盒子里. ...
 - 【JAVA零基础入门系列】Day5 Java中的运算符
		
运算符,顾名思义就是用于运算的符号,比如最简单的+-*/,这些运算符可以用来进行数学运算,举个最简单的栗子: 已知长方形的长为3cm,高为4cm,求长方形的面积. 好,我们先新建一个项目,命名为Rec ...
 - 【JAVA零基础入门系列】Day8 Java的控制流程
		
什么是控制流程?简单来说就是控制程序运行逻辑的,因为程序一般而言不会直接一步运行到底,而是需要加上一些判断,一些循环等等.举个栗子,就好比你准备出门买个苹果,把这个过程当成程序的话,可能需要先判断一下 ...
 
随机推荐
- 006 jquery过滤选择器-----------(可见性过滤选择器)
			
1.介绍 2.程序 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...
 - [USACO16JAN]子共七Subsequences Summing to Sevens
			
[USACO16JAN]子共七Subsequences Summing to Sevensa[i]表示前缀和如果a[i]%7==t&&a[j]%7==t那么a[j]-a[i-1]一定是 ...
 - spring过滤器
			
什么是过滤器 Spring 中不能处理用户请求,但可以用来提供过滤作用的一种Servlet规范.在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理.具 ...
 - querySelector/querySelectorAll选择器两个容易忽略的点
			
jquery写得多了,原生js大API就容易忘.如果你也是这样,一起来回顾一下HTML5的类jquery选择器querySelector和querySelectorAll吧,querySelector ...
 - linux学习笔记-12.输入输出重定向及管道
			
1.新建一个文件 touch a.txt> b.txt 2.错误重定向:2> find /etc -name zhaoxing.txt 2> error.txt 3.将正确或错误的信 ...
 - mysql where 条件中的字段有NULL值时的sql语句写法
			
比如你有一个sql语句联表出来之后是这样的 id name phone status 1 张三 ...
 - Linux下实现自动设置SSH代理
			
SSH的巨大价值体现在能够配置为代理服务器上.不像在Windows下每次还需要手动登录设置,Linux有很好的工具链能够实现自动设置SSH代理,就是expect和ssh的联合使用,再加上proxych ...
 - Git和Gitlab
			
参考 http://www.cnblogs.com/clsn/p/7929958.html#auto_id_16https://backlog.com/git-tutorial/cn/intro/in ...
 - spring cloud 学习(11) - 用fastson替换jackson及用gb2312码输出
			
前几天遇到一个需求,因为要兼容旧项目的编码格式,需要spring-cloud的rest接口,输出gb2312编码,本以为是一个很容易的事情,比如下面这样: @RequestMapping(method ...
 - 面向企业级的开源WebGIS解决方案--MapGuide(对比分析)
			
在技术特点.功能.架构等方面,MapGuide与其他WebGIS产品有什么区别?本文主要从此角度来介绍MapGuide的特性,以供参考. 本人选择了比较熟悉的几款WebGIS产品:MapServ ...