
1. 数据库设计规范
1、表名前添加“t_”等表示用户级别的表,或采用复数名称,不与其他表名冲突。
2、数据库使用 InnoDB 存储引擎。(MySQL)
3、表名、字段名采用下划线风格,即所有字母小写,单词间用下划线分隔。login_name
4、每个表都有一个 int 型的主键“id”,并设为自动增长,初值可以不为 1。
5、不添加外键约束,提高操作速度。
6、字段尽量定义为 NOT NULL,因为 NULL 字段被索引时需要一个额外的字节,NULL 字段作索
引比较是更复杂,可以使用 0 或空字符串等代码中没有含义的值占位(比如创建字段是默认的空字
符串值)。如果一个字段是索引字段时一定要定义为 NOT NULL。所有字符串型字段的设默认值设为
空字符串'',保证为非空。
7、可以使用 varchar 的字段尽可能不使用 TEXT 和 BLOB 类型。
6、操作时间设默认值:DEFAULT CURRENT_TIMESTAMP。(MySQL)
7、所有非外键的整型(均为 int,读写更快)字段都指定默认值。
8、枚举值都不单独建表存储,而是直接存入字段(比如 status、type)中预定义每个枚举值的
含义。
9、部门表等使用自关联设计表示记录之间的层级关系。
10、所有字段添加注释,如果是 status 这样的枚举值字段时,要枚举出所有可能的值以及其含
义。
11、所有表的字符集选择 utf8 或 utf8mb4,否则可能出现乱码。

2. 访问数据库
ADO.NET(ActiveX Data Objects.NET)是.NET Framework的重要组成部分,使用它可以快捷的访
问数据库。(Entity Framework, EF)
2.1. ADO.NET 概述
ADO.NET对象模型由两部分组成:数据集(DataSet),与数据源断开且不需要知道所保持的数
据的来源;.NET数据提供程序,它能够与数据源连接,并执行对数据源的SQL命令。
2.1.1. .NET 数据提供程序
.NET数据提供程序可分为Connection对象(用于连接到数据源)、Command对象(用于执行针对
数据库的命令并且检索DataReader或者DataSet,或者用于执行针对数据源的INSERT、UPDATE或
DELETE命令)、DataReader对象(一个已连接的、向前只读结果集)和DataAdapter对象(用于从数
据源产生一个DataSet,并且更新数据源)四部分。
2.1.2. 数据库应用程序的开发流程
创建数据库;
使用Connection对象创建到数据库的连接;
使用Command对象对数据源执行SQL命令并返回数据;
利用DataReader或DataSet对象读取和处理数据源的数据。
2.2. 数据库访问常用对象
2.2.1. 数据库连接对象 Connection
SqlConnection表示到 SQL Server 数据库的打开连接。
1、在App.config配置文件中配置连接字符串
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<!--配置字符串-->
<connectionStrings>
<add name="connStr" connectionString="Data Source=.\SQLEXPRESS;Initial
Catalog=book_store;User ID=sa;PassWord=sa2017" />
</connectionStrings>
</configuration>

2、在DAL项目中添加引用System.Configuration。
3、在SQLHelper.cs中如下内容:
using System.Configuration;
string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
using (SqlConnection conn = new SqlConnection(connStr)){ ... }
SqlConnection()
初始化 SqlConnection 类的新实例。
SqlConnection(String)
如果给定一个包含连接字符串的字符串,则初始化 SqlConnection 类的新实例。
SqlConnection(String,
SqlCredential)
在给定连接字符串的情况下,初始化 SqlConnection 类的新实例,而不使用 Integrated Security
= true 和包含用户 ID 和密码的 SqlCredential 对象。
ADO.NET提供了两个使用连接对象的类:DataAdapter类(用来填充DataTable或DataSet);
Command类(提供Execute方法可以读取数据)。
2.2.2. 执行数据库命令对象 Command
SqlCommand 类表示要对 SQL Server 数据库执行的一个 Transact-SQL 语句或存储过程。
/// <summary>
/// 执行增删改 insert into ,delete ,update
/// </summary>
/// <param name="sql">sql语句</param>
/// <param name="param">参数</param>
/// <returns>多少行受影响</returns>
public static int ExecuteNonQuery(string sql, params SqlParameter[] param)
{
using (SqlConnection conn = new SqlConnection(connStr))
{
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.AddRange(param);
conn.Open();
return cmd.ExecuteNonQuery();
}
}
}
名称
描述
SqlCommand()
初始化 SqlCommand 类的新实例。
SqlCommand(String)
使用查询的文本初始化 SqlCommand 类的新实例。
SqlCommand(String, SqlConnection)
使用查询的文本和一个 SqlConnection 初始化 SqlCommand 类的新实
例。
SqlCommand(String, SqlConnection,
SqlTransaction)
使用查询文本、 SqlConnection 以及 SqlTransaction 初始化 SqlCommand
类的新实例。
SqlCommand(String, SqlConnection,
SqlTransaction,
SqlCommandColumnEncryptionSetting)
Parameters
获取 SqlParameterCollection。
ExecuteNonQuery
对连接执行 Transact-SQL 语句并返回受影响的行数。(重写 DbCommand.ExecuteNonQuery()。)
ExecuteReader()
将 CommandText 发送到 Connection 并生成一个 SqlDataReader。
ExecuteScalar
执行查询,并返回由查询返回的结果集中的第一行的第一列。其他列或行将被忽略。(重写
DbCommand.ExecuteScalar()。)
ExecuteXmlReader
将 CommandText 发送到 Connection 并生成一个 XmlReader 对象。
2.2.3. SqlParameterCollection 类
表示与 SqlCommand 相关联的参数的集合以及各个参数到 DataSet 中列的映射。
名称
描述
Add(Object)
将 指 定 的 SqlParameter 对 象 添 加 到 SqlParameterCollection 中 。 ( 重 写

DbParameterCollection.Add(Object)。)
Add(SqlParameter)
将指定的 SqlParameter 对象添加到 SqlParameterCollection 中。
Add(String, SqlDbType)
将 SqlParameter 添加到指定了参数名和数据类型的 SqlParameterCollection 中。
Add(String, Object)
已过时。将指定的 SqlParameter 对象添加到 SqlParameterCollection 中。
Add(String, SqlDbType, Int32)
将 SqlParameter 添加到 SqlParameterCollection 中(给定了指定的参数名、SqlDbType 和大小)。
Add(String, SqlDbType, Int32,
String)
将 SqlParameter 及其参数名、数据类型和列宽添加到 SqlParameterCollection 中。
AddRange(Array)
向 SqlParameterCollection 的末尾添加值数组。(重写 DbParameterCollection.AddRange(Array)。)
AddRange( SqlParameter[] )
向 SqlParameterCollection 的末尾添加 SqlParameter 值的数组。
AddWithValue
向 SqlParameterCollection 的末尾添加值。
Clear
从 SqlParameterCollection 中移除所有 SqlParameter 对象。(重写 DbParameterCollection.Clear()。)
2.2.4. SqlParameter 类
表示 SqlCommand 的参数,也可以是它到 DataSet 列的映射。
//参数列表
SqlParameter[] param = {
new SqlParameter("@eName",SqlDbType.VarChar),
new SqlParameter("@ePassword",SqlDbType.VarChar),
new SqlParameter("@eBirthday",SqlDbType.Date),
new SqlParameter("@eEmail",SqlDbType.VarChar),
new SqlParameter("@eIsDel",SqlDbType.Int),
new SqlParameter("@eType",SqlDbType.Int)
};
//参数赋值
param[0].Value = employee.EName;
param[1].Value = employee.EPassword;
param[2].Value = employee.EBirthday;
param[3].Value = employee.EEmail;
param[4].Value = employee.EIsDel;
param[5].Value = employee.EType;
名称
描述
SqlParameter()
初始化 SqlParameter 类的新实例。
SqlParameter(String, SqlDbType)
用参数名称和数据类型初始化 SqlParameter 类的新实例。
SqlParameter(String, Object)
用参数名称和新 SqlParameter 的一个值初始化 SqlParameter 类的新实例。
SqlParameter(String, SqlDbType, Int32)
用参数名称、 SqlDbType 和大小初始化 SqlParameter 类的新实例。
SqlParameter(String, SqlDbType, Int32,
String)
用参数名称、 SqlDbType、大小和源列名称初始化 SqlParameter 类的新实例。
SqlParameter(String, SqlDbType, Int32,
ParameterDirection, Boolean, Byte, Byte,
String, DataRowVersion, Object)
用参数名称、参数的类型、参数的大小、 ParameterDirection、参数的精度、
参数的小数位数、源列、要使用的 DataRowVersion 和参数的值初始化
SqlParameter 类的新实例。
SqlParameter(String, SqlDbType, Int32,
ParameterDirection, Byte, Byte, String,
DataRowVersion, Boolean, Object, String,
String, String)
初始化 SqlParameter 类的一个新实例,该类使用参数名、参数的类型、参数
的长度、方向、精度、小数位数、源列名称、 DataRowVersion 值之一、用于
源列映射的布尔值、SqlParameter 的值、此 XML 实例的架构集合所在的数
据库的名称、此 XML 实例的架构集合所在的关系架构以及此参数的架构集
合的名称。
Value
获取或设置该参数的值。
2.2.5. 参数化查询
使用参数化查询,就是在向数据库发送SQL语句时,在需要传入值得地方使用参数,而不是直接
拼接SQL语句(有SQL注入风险)。参数是一种占位符,参数是可以命名的,以字符@开头。例如:
update employee set ePassword=@pwd where eName=@name
2.2.6. SqlDataReader 类
提供一种从 SQL Server 数据库读取行的只读向前的方式。

2.2.7. SqlDataAdapter 类
表示用于填充DataSet和更新SQL Server数据库的一组数据命令和一个数据库连接。DataAdapter
(数据适配器)对象是DataSet对象和数据存储之间的桥梁。DataAdapter对象仅仅在需要填充DataSet
对象时,才使用数据库连接,完成操作后就释放所有的资源。
Fill(DataSet)
在 DataSet 中添加或刷新行。(继承自 DbDataAdapter。)
Fill(DataTable)
在 DataSet 的指定范围中添加或刷新行,以与使用 DataTable 名称的数据源中的行匹配。
(继承自 DbDataAdapter。)
Fill(DataSet, String)
在 DataSet 中添加或刷新行以匹配使用 DataSet 和 DataTable 名称的数据源中的行。(继承
自 DbDataAdapter。)
Fill(Int32,Int32, DataTable[] )
在 DataTable 中添加或刷新行,以与从指定的记录开始一直检索到指定的最大数目的记录
的数据源中的行匹配。(继承自 DbDataAdapter。)
Fill(DataSet, Int32, Int32, String)
在 DataSet 的指定范围中添加或刷新行以匹配使用 DataSet 和 DataTable 名称的数据源中
的行。(继承自 DbDataAdapter。)
Update( DataRow[] )
通过为 DataSet 中的指定数组中的每个已插入、已更新或已删除的行执行相应的 INSERT、
UPDATE 或 DELETE 语句来更新数据库中的值。(继承自 DbDataAdapter。)
Update(DataSet)
通过为指定的 DataSet 中的每个已插入、已更新或已删除的行执行相应的 INSERT、
UPDATE 或 DELETE 语句来更新数据库中的值。(继承自 DbDataAdapter。)
Update(DataTable)
通过为指定的 DataTable 中的每个已插入、已更新或已删除的行执行相应的 INSERT、
UPDATE 或 DELETE 语句来更新数据库中的值。(继承自 DbDataAdapter。)
Update(DataSet, String)
通过为具有指定名称 DataTable 的 DataSet 中的每个已插入、已更新或已删除的行执行相
应的 INSERT、UPDATE 或 DELETE 语句来更新数据库中的值。(继承自 DbDataAdapter。)
2.2.8. DataSet 类
表示一个存放于内存中的数据缓存。DataSet对象由3个集合组成:Tables、Relations和
ExtendedProperties。DataSet对象包含主键、外键以及条件约束等信息。
2.2.9. DataTable 类
表示一个内存中数据表。
Rows
获取属于该表的行的集合。
Columns
获取属于该表的列的集合。
2.2.10. DataRow 类
表示 DataTable 中的一行数据。
Item[ Int32]
获取或设置存储在由索引指定的列中的数据。
Item[ String]
获取或设置存储在由名称指定的列中的数据。
//1 sql语句
string sql = "select * from employee where eIsdel=" + isDel;
//2 执行
DataTable dt;
using (SqlConnection conn = new SqlConnection(connStr))
{
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.AddRange();
using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
{
DataTable dt = new DataTable();
sda.Fill(dt);
}
}
}