20.4 搭建系统数据库
为了便于实例程序的实现,将系统内所有的信息数据存储在专用数据库内。这样,将大大方便对系统的管理和维护。因为整个系统将在Web中发布,可能会有大量的用户浏览,所以用SQL Server 2005数据库来存放这些海量的信息。
20.4.1 数据库设计
设计数据库名为“liuyan”,其中系统留言信息表(Message)的具体设计结构如表20-1所示。
表20-1 系统留言信息表(Message)
字 段 名 称 |
数 据 类 型 |
是 否 主 键 |
默 认 值 |
功 能 描 述 |
---|---|---|---|---|
ID |
int |
是 |
递增1 |
编号 |
Title |
varchar(200) |
否 |
Null |
标题 |
Message |
Text |
否 |
Null |
内容 |
CreateDate |
datetime |
否 |
Null |
时间 |
IP |
Varchar(20) |
否 |
Null |
IP地址 |
|
varchar(250) |
否 |
Null |
邮箱 |
Status |
tinyint |
否 |
0 |
状态 |
系统留言回复信息表(Reply)的具体设计结构如表20-2所示。
表20-2 系统留言回复信息表(Reply)
字 段 名 称 |
数 据 类 型 |
是 否 主 键 |
默 认 值 |
功 能 描 述 |
---|---|---|---|---|
ID |
int |
是 |
递增1 |
编号 |
Reply |
varchar(3000) |
否 |
Null |
内容 |
CreateDate |
datetime |
否 |
Null |
时间 |
IP |
varchar(20) |
否 |
Null |
IP地址 |
MessageID |
int |
否 |
Null |
留言比编号 |
20.4.2 数据库访问层设计
本系统应用程序的数据库访问层由文件“lei.cs”实现的。文件“lei.cs”的主要功能是在ASPNETAJAXWeb. AjaxLeaveword空间内建立Message类,并实现对系统库中数据的处理。上述功能的实现流程如图20-3所示。
图20-3 数据库访问层实现流程图
文件“lei.cs”的具体实现流程如下。
1.定义Message类
定义Message类的实现代码如下。
sing System;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;
namespace ASPNETAJAXWeb.AjaxLeaveword
{
public class Message
{
public Message()
{
……
}
2.获取系统内留言信息
获取系统内留言信息即获取系统库内已存在的留言信息,其功能是由方法GetMessages()实现的。方法GetMessages()的实现过程如下。
(1)从系统配置文件Web.config内获取数据库连接参数,并将其保存在ConnectionString内。
(2)使用连接字符串创建con对象,实现数据库连接。
(3)新建获取数据库留言数据的SQL查询语句。
(4)创建获取数据的对象da。
(5)打开数据库连接,获取查询数据。
(6)将获取的查询结果保存在ds中,并返回ds。
上述功能对应的实现代码如下。
public DataSet GetMessages()
{ //获取连接字符串
string connectionString = ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRING"].Connection String;
//创建连接
SqlConnection con = new SqlConnection(connectionString);
//创建SQL语句
string cmdText = "SELECT * FROM Message Order by CreateDate DESC";
//创建SqlDataAdapter
SqlDataAdapter da = new SqlDataAdapter(cmdText,con);
//定义DataSet
DataSet ds = new DataSet();
try
{ //打开连接
con.Open();
//填充数据
da.Fill(ds,"DataTable");
}
catch(Exception ex)
{ //抛出异常
throw new Exception(ex.Message,ex);
}
finally
{ //关闭连接
con.Close();
}
return ds;
}
3.添加系统留言信息
添加系统留言信息即将新发布的留言信息添加到系统库中,其功能是由方法AddMessage(string title,string message,string ip,string email)实现的。方法AddMessage(string title,string message,string ip,string email)的实现过程如下。
(1)从系统配置文件Web.config内获取数据库连接参数,并将其保存在connectionString内。
(2)使用连接字符串创建con对象,实现数据库连接。
(3)使用SQL添加语句,然后创建cmd对象,准备插入操作。
(4)打开数据库连接,执行新数据插入操作。
(5)将数据插入操作所涉及的行数保存在result中。
(6)如果插入成功,则返回result值;如果插入失败,则返回-1。
上述功能对应的实现代码如下。
public int AddMessage(string title,string message,string ip,string email)
{
string connectionString = ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTR ING"].Connection String;
SqlConnection con = new SqlConnection(connectionString);
//创建SQL语句
string cmdText = "INSERT INTO Message(Title,Message,IP,Email,CreateDate,Status)VALUES(@Title, @Message,
@IP,@Email,GETDATE(),0)";
SqlCommand cmd = new SqlCommand(cmdText,con);
//创建参数并赋值
cmd.Parameters.Add("@Title",SqlDbType.VarChar,200);
cmd.Parameters.Add("@Message",SqlDbType.Text);
cmd.Parameters.Add("@Ip",SqlDbType.VarChar,20);
cmd.Parameters.Add("@Email",SqlDbType.VarChar,255);
cmd.Parameters[0].Value = title;
cmd.Parameters[1].Value = message;
cmd.Parameters[2].Value = ip;
cmd.Parameters[3].Value = email;
int result = −1;
try
{ //打开连接
con.Open();
//操作数据
result = cmd.ExecuteNonQuery();
}
catch(Exception ex)
{ //抛出异常
throw new Exception(ex.Message,ex);
}
finally
{ //关闭连接
con.Close();
}
return result;
}
4.删除系统留言信息
删除系统留言信息即将系统内存在的留言数据从系统库中删除,其功能是由方法DeleteMessage(int messageID)实现的。方法DeleteMessage(int messageID)的实现过程如下。
(1)从系统配置文件Web.config内获取数据库连接参数,并将其保存在connectionString内。
(2)使用连接字符串创建con对象,实现数据库连接。
(3)使用SQL删除语句,然后创建cmd对象,准备删除操作。
(4)打开数据库连接,执行新数据删除操作。
(5)将数据删除操作所涉及的行数保存在result中。
(6)如果删除成功,则返回result值;如果删除失败,则返回-1。
上述功能对应的实现代码如下。
public int DeleteMessage(int messageID)
{ string connectionString = ConfigurationManager.ConnectionStrings["SQLCONNECTIO NSTRING"]. ConnectionString;
SqlConnection con = new SqlConnection(connectionString);
//创建SQL语句
string cmdText = "DELETE Message WHERE ID = @ID";
SqlCommand cmd = new SqlCommand(cmdText,con);
//创建参数并赋值
cmd.Parameters.Add("@ID",SqlDbType.Int,4);
cmd.Parameters[0].Value = messageID;
int result = −1;
try
{ //打开连接
con.Open();
//操作数据
result = cmd.ExecuteNonQuery();
}
catch(Exception ex)
{ //抛出异常
throw new Exception(ex.Message,ex);
}
finally
{ //关闭连接
con.Close();
}
return result;
}
5.获取系统内留言回复信息
获取系统内留言回复信息即查询系统库内用户对留言的回复信息数据,其功能是由方法GetReplyByMessage(int messageID)实现的。方法GetReplyByMessage(int messageID)的实现过程如下。
(1)从系统配置文件Web.config内获取数据库连接参数,并将其保存在connectionString内。
(2)使用连接字符串创建con对象,实现数据库连接。
(3)新建查询数据库留言回复数据的SQL查询语句。
(4)创建获取数据的对象da。
(5)打开数据库连接,获取查询数据。
(6)将获取的查询结果保存在ds中,并返回ds。
上述功能对应的实现代码如下。
public DataSet GetReplyByMessage(int messageID)
{
string connectionString=ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRING"]. Connection String;
SqlConnection con = new SqlConnection(connectionString);
//创建SQL语句
string cmdText = "SELECT * FROM Reply WHERE MessageID = @MessageID Order by CreateDate DESC";
SqlDataAdapter da = new SqlDataAdapter(cmdText,con);
//创建参数并赋值
da.SelectCommand.Parameters.Add("@MessageID",SqlDbType.Int,4);
da.SelectCommand.Parameters[0].Value = messageID;
//定义DataSet
DataSet ds = new DataSet();
try
{
con.Open();
//填充数据
da.Fill(ds,"DataTable");
}
catch(Exception ex)
{
throw new Exception(ex.Message,ex);
}
finally
{ //关闭连接
con.Close();
}
return ds;
}
6.添加留言回复信息
添加留言回复信息即将新发布的留言回复信息添加到系统库中,其功能是由方法AddReply(string message,string ip,int messageID)实现的。方法AddReply(string message,string ip,int messageID)的实现过程如下。
(1)从系统配置文件Web.config内获取数据库连接参数,并将其保存在connectionString内。
(2)使用连接字符串创建con对象,实现数据库连接。
(3)使用SQL添加语句,然后创建cmd对象,准备插入操作。
(4)打开数据库连接,执行新数据插入操作。
(5)将数据插入操作所涉及的行数保存在result中。
(6)如果插入成功,则返回result值;如果插入失败,则返回-1。
上述功能对应的实现代码如下。
public int AddReply(string message,string ip,int messageID)
{
string connectionString=ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRING"]. Connection String;
SqlConnection con = new SqlConnection(connectionString);
string cmdText="INSERT INTO Reply(Reply,IP,CreateDate,MessageID)VALUES(@Reply,@IP, GETDATE(),
@MessageID)";
SqlCommand cmd = new SqlCommand(cmdText,con);
//创建参数并赋值
cmd.Parameters.Add("@Reply",SqlDbType.VarChar,3000);
cmd.Parameters.Add("@Ip",SqlDbType.VarChar,20);
cmd.Parameters.Add("@MessageID",SqlDbType.Int,4);
cmd.Parameters[0].Value = message;
cmd.Parameters[1].Value = ip;
cmd.Parameters[2].Value = messageID;
int result = −1;
try
{ //打开连接
con.Open();
//操作数据
result = cmd.ExecuteNonQuery();
}
catch(Exception ex)
{ //抛出异常
throw new Exception(ex.Message,ex);
}
finally
{ //关闭连接
con.Close();
}
return result;
}
}
}
数据查询的效率很重要,因为数据库技术是动态站点的基础,所以在Web程序内会有大量的查询语句。同时随着站点访问量的增加,一个站点可能同时需要查询大量数据,所以数据库查询的效率问题便提上了日常议程。在此向读者提出如下两条建议。
(1)合理使用索引
并不是所有索引对查询都有效。SQL是根据表中数据进行查询优化的,当索引列中有大量数据重复时,SQL查询可能不会去利用索引。例如,某一表中有字段sex,而male、female几乎各一半,那么即使在sex上创建了索引也对查询效率起不了作用。读者可以在百度中通过检索“索引效率优化”关键字来获取相关知识。
(2)使用存储过程
存储过程是一个很好的工具,不但提高了程序的安全型,而且也提高了数据处理效率。编写合理的语句可以决定存储过程和触发器的效率。