1.两个重要概念:约定优于配置,关注点分离

2.Model

2.1.Model概念

a.MVC中数据由Model提供,算法由Controller提供
b.Model并不是指程序内的局部变量、全局变量或者常数那类数据,而是指由程序外部所提供的数据,凡是数据库、文件、web service、其他的应用程序或者系统乃至不同程序演算出来的结果,都可以算是Model
c.Model基本上不属于个别应用程序,而是会特别将Model剥离到架构层面上,让Model可以被大部分程序所共享。通常会在Model和实际数据源之间插入一个中介层,由中介层负责与数据源进行互动

2.2.Model的类型

a.数据源、程序的处理和计算

2.3.Model的设计

fat Model, skinny Controller(Model要肥,Controller要轻)Model必须要顾及到程序所需的数据,Controller必须要轻量化以具有快速反应的能力

2.4.ADO.NET

简介:a.数据访问模型
b.提供对数据库或者外部数据源的数据访问接口

面向连接:以数据库连接为基础,再打开数据库连接后,将数据访问指令送入数据库内执行,利用游标来存取结果集的访问模式

优点:访问速度快
缺点:必须建立连接,否则会出现锁定问题

面向无连接:先以面向连接的方式读取数据,将数据放入内存,再通过一系列的对象、属性与方法进行数据的访问,而访问都是在内存中进行的,与数据库没有维持连接

优点:节省数据库的连接资源,没有访问的锁定问题
缺点:耗费内存,并且数据更新不会反映到数据库

面向连接的操作:

以IDbConnection接口为起点,通过open()打开数据库连接,操作数据库完成后用close()关闭。
如果需要数据库事务处理,则在连接打开后使用BeginTransaction方法启动事务处理,并得到IDbTransaction接口的对象,执行过程中发生任何错误或撤销事务处理时,可以使用Rollback()撤销。反之则用commit()来提示完成
连接状态下,执行SQL指令前,不能直接用SQL指令操作,需要将指令封装于IDbCommand接口对象(该对象包含参数的设置,而在SQL指令中使用参数是预防SQL Injection最好的方法,对象也提供了控制执行方式的配置设置)指令设置完成时,可通过ExecuteReader()、ExecuteNonQuery()以及ExecuteScalar()来执行
ExecuteReader传回IDataReader接口对象,IDataReader接口对象代表了数据库返回的单向前向游标(单向前向游标是只读的,不能直接操作IDataReader接口对象来修改数据,修改唯一方法是执行SQL指令)
ExecuteReader()是获取IDataReader接口对象的唯一方法
IDataReader接口对象的使用:每调用一次Read方法可以将游标前移一行,利用GetValue()获取字段值,使用GetOrdinal()获取字段的索引编号,ISDBNULL()判断字段是否为NULL值

面向无连接的操作:

DataSet:内存里的数据库。DataSet可以容纳多个DATaTable
DATaTable:内存里的数据表。可拥有条件以及关联的设置
DataSet数据获取方式:a.由IDbDataAdapter接口对象的Fill()获得,IDbDataAdapter会利用SelectCommand属性所内含的SELECT指令执行的结果生成相应的DataTable,并加入到DataSet内
b.以Fill()生成DataTable手动加入到DataSet内
DataSet和DaTaTable同时支持合并功能,使用merege()允许程序将两个数据集或者数据行合并
DataTable是实际存储数据的对象,内容纳了定义字段的DataColumn对象以及加载数据的DataRow对象

2.5设计泛型类

包括:允许哪些类型使用,程序中如何处理类型
为提高程序可读性:类型参数只有一个时才使用T,其他使用有意义名称

2.6.SQL Injection
导致SQL Injection漏洞的四个要件

a.使用字符串连接方式组成SQL指令字符串
b.使用大权限的账户连接数据库
c.开放过多的权限(包括用不到com程序包却开放了sq_QA*存储过程和函数,或是xp_cmdshell)
d.过于信任用户,未验证用户的任何输入

解决方法

a.使用参数化查询方法,并且需要经常查询
b.检查连接的账户是否有过大权限
c.检查用户指令
d.关闭数据库内不必要的权限

02-24 17:08