C# 培训之零基础入门 10:打老鼠之数据存储
2013-02-13 17:01
477 查看
到此为止,打老鼠游戏还不能保存每次游戏的成绩,我们今天完成的任务就是要存储成绩到SQLSERVER的数据库中。
一:数据库设计
在上节课中,我们已经知道了如何创建数据库,所有,先创建数据库“MouseGame”,然后,按如下的数据格式建立一个数据表(表名:GameRecord):
二:数据库读写
数据库的读写部分,请查看视频:
Lesson10.wmv(我已在线发送给你);
备注:本文是课程《.NET C# 零基础入门》的免费部分,详细请参见[b]“TMJ .NET在线培训”[/b]
最终,我们的成绩查看界面如下:
三:将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>转换;
一:数据库设计
在上节课中,我们已经知道了如何创建数据库,所有,先创建数据库“MouseGame”,然后,按如下的数据格式建立一个数据表(表名:GameRecord):
二:数据库读写
数据库的读写部分,请查看视频:
Lesson10.wmv(我已在线发送给你);
备注:本文是课程《.NET C# 零基础入门》的免费部分,详细请参见[b]“TMJ .NET在线培训”[/b]
最终,我们的成绩查看界面如下:
三:将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>转换;
相关文章推荐
- C# 在线培训之零基础入门 04:打老鼠初级之枚举、重构、事件处理器
- C# 培训之零基础入门 07:打老鼠之面向对象重构
- .NET零基础入门10:打老鼠之数据存储
- C# 在线培训之零基础入门 03:打老鼠初级
- 【原创】开源Math.NET基础数学类库使用(10)C#进行基本数据统计
- C# 在线培训之零基础入门 05:委托与事件
- Python零基础入门之十二数据永久存储
- C# 在线培训之零基础入门 06:面向对象入门
- Python学习入门基础教程(learning Python)--5.7 Python文件数据记录存储与处理
- C# 培训之零基础入门 08:代码规范
- C#零基础入门04:打老鼠初级之枚举、重构、事件处理器
- Android基础入门教程——6.2 数据存储与访问之——SharedPreferences保存用户偏好参数
- android基础入门数据存储之File(13)
- C# 培训之零基础入门 09:SQL必知必会
- android基础入门数据存储之SharedPreferences(14)
- C#培训之零基础入门 11:异常和调试
- 【Android】【笔记】《Android 入门经典》part 10 数据存储
- Android基础入门教程——6.3.2 数据存储与访问之——又见SQLite数据库
- 黑马程序员.Net培训 C#基础知识——数据类型
- C# 在线培训之零基础入门 01:开篇及C#程序、解决方案的结构