21.4 数据库访问层
作为整个项目的核心和难点,本项目的数据访问层分为如下4个部分。
- 登录验证。
- 聊天室主页。
- 聊天交流处理。
- 系统管理。
为了便于后期维护,专门编写了文件Chat.cs来实现。其主要功能是在ASPNETAJAXWeb. AjaxChat控件中建立Chat类,并定义多个方法实现对各系统文件在数据库中的处理。
21.4.1 数据访问层——登录验证处理
在文件chat.cs中,与用户登录验证模块相关的是方法GetUser(string username,string password),其运行流程如图21-2所示。
图21-2 登录验证模块数据访问层运行流程图
下面介绍上述方法的具体实现过程。
1.定义Chat类
定义Chat类的实现代码如下。
using System;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;
namespace ASPNETAJAXWeb.AjaxChat
……
public class Chat
{
public Chat()
{
//
}
2.获取登录用户信息
获取登录用户信息即获取当前登录用户的用户名和密码,确保合法用户才能登录系统。此功能是由方法GetUser(string username,string password)实现的,其具体实现过程如下。
(1)从系统配置文件Web.config内获取数据库连接参数,并将其保存在connectionString内。
(2)使用连接字符串创建con对象,实现数据库连接。
(3)新建获取数据库内用户名和密码信息的SQL查询语句。
(4)创建获取数据的对象cmd。
(5)打开数据库连接,获取查询数据。
(6)将获取的查询结果保存在dr中,并返回dr。
上述过程的对应实现代码如下。
public SqlDataReader GetUser(string username,string password)
{ //获取连接字符串
string connectionString = ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRING"].Connection String;
//创建连接
SqlConnection con = new SqlConnection(connectionString);
//创建SQL语句
string cmdText = "SELECT ID FROM [User] WHERE Username=@Username AND Password=@Password";
//创建SqlCommand
SqlCommand cmd = new SqlCommand(cmdText,con);
//创建参数并赋值
cmd.Parameters.Add("@Username",SqlDbType.VarChar,50);
cmd.Parameters.Add("@Password",SqlDbType.VarChar,255);
cmd.Parameters[0].Value = username;
cmd.Parameters[1].Value = password;
//定义SqlDataReader
SqlDataReader dr;
try
{ //打开连接
con.Open();
//读取数据
dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch(Exception ex)
{ //抛出异常
throw new Exception(ex.Message,ex);
}
return dr;
}
21.4.2 数据访问层——聊天处理
在文件chat.cs中,与系统在线聊天处理模块相关的方法如下。
- GetNeirong(int chatID)。
- GetSingleNeirong(int messageID)。
- AddNeirong(string message,int userID,int chatID)。
上述方法的运行流程如图21-3所示。
图21-3 聊天处理模块数据访问层运行流程图
接下来将分别介绍上述方法的具体实现过程。
1.方法GetNeirong(int chatID)
方法GetNeirong(int chatID)的功能是获取某ID编号聊天室的聊天信息,其具体实现过程如下。
(1)从系统配置文件Web.config中获取数据库连接参数,并将其保存在connectionString中。
(2)使用连接字符串创建con对象,实现数据库连接。
(3)新建SQL查询语句,获取数据库内某ID编号聊天室的聊天信息。
(4)创建获取数据的对象da。
(5)打开数据库连接,获取查询数据。
(6)将获取的查询结果保存在ds中,并返回ds。
上述过程的对应实现代码如下。
public DataSet GetNeirong(int chatID)
{
string connectionString = ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRING"].Connection String;
SqlConnection con = new SqlConnection(connectionString);
//创建SQL语句
string cmdText = "SELECT Message.*,[User].Username FROM Message INNER JOIN [User] ON Message.User
ID=[User].ID WHERE ChatID=@ChatID Order by CreateDate DESC";
//创建SqlDataAdapter
SqlDataAdapter da = new SqlDataAdapter(cmdText,con);
//创建参数并赋值
da.SelectCommand.Parameters.Add("@ChatID",SqlDbType.Int,4);
da.SelectCommand.Parameters[0].Value = chatID;
//定义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;
}
2.方法GetSingleNeirong(int messageID)
方法GetSingleNeirong(int messageID)的功能是获取某ID编号的聊天信息。其具体实现过程如下。
(1)从系统配置文件Web.config中获取数据库连接参数,并将其保存在connectionString中。
(2)使用连接字符串创建con对象,实现数据库连接。
(3)新建SQL查询语句,获取数据库中某ID编号的聊天信息。
(4)创建获取数据的对象cmd。
(5)打开数据库连接,获取查询数据。
(6)将获取的查询结果保存在dr中,并返回dr。
上述过程的对应实现代码如下。
public SqlDataReader GetSingleNeirong(int messageID)
{
string connectionString = ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRING"].Connection String;
SqlConnection con = new SqlConnection(connectionString);
string cmdText = "SELECT * FROM Message WHERE ID = @ID";
//创建SqlCommand
SqlCommand cmd = new SqlCommand(cmdText,con);
//创建参数并赋值
cmd.Parameters.Add("@ID",SqlDbType.Int,4);
cmd.Parameters[0].Value = messageID;
//定义SqlDataReader
SqlDataReader dr;
try
{
con.Open();
//读取数据
dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch(Exception ex)
{
throw new Exception(ex.Message,ex);
}
return dr;
}
3.方法AddNeirong(string message,int userID,int chatID)
方法AddNeirong(string message,int userID,int chatID)的功能是将用户发送的聊天信息添加到系统库中。其具体实现过程如下。
(1)从系统配置文件Web.config中获取数据库连接参数,并将其保存在connectionString中。
(2)使用连接字符串创建con对象,实现数据库连接。
(3)新建SQL添加语句,向数据库内添加某ID编号的聊天信息。
(4)创建获取数据的对象cmd。
(5)打开数据库连接,执行添加处理。
(6)将操作结果保存在dr中,并返回dr。
上述过程的对应实现代码如下。
public int AddNeirong(string message,int userID,int chatID)
{
string connectionString = ConfigurationManager.ConnectionStrings["SQLCON NECTIONSTRING"].Connection String;
SqlConnection con = new SqlConnection(connectionString);
//创建SQL语句
string cmdText = "INSERT INTO Message(Message,UserID,ChatID,CreateDate) VALUES(@Message,@UserID,
@ChatID,GETDATE())";
//创建SqlCommand
SqlCommand cmd = new SqlCommand(cmdText,con);
//创建参数并赋值
cmd.Parameters.Add("@Message",SqlDbType.VarChar,1000);
cmd.Parameters.Add("@UserID",SqlDbType.Int,4);
cmd.Parameters.Add("@ChatID",SqlDbType.Int,1);
cmd.Parameters[0].Value = message;
cmd.Parameters[1].Value = userID;
cmd.Parameters[2].Value = chatID;
int result = −1;
try
{
con.Open();
//操作数据
result = cmd.ExecuteNonQuery();
}
catch(Exception ex)
{
throw new Exception(ex.Message,ex);
}
finally
{
con.Close();
}
return result;
}
21.4.3 数据访问层——系统管理
在文件chat.cs中,与系统聊天室管理模块相关的方法如下。
- GetUser(string username,string password)。
- GetLiaotian()。
- GetSingleLiaotian(int chatID)。
- AddLiaotian(string chatName,int maxNumber,byte status,string remark)。
- UpdateLiaotian(int chatID,string chatName,int maxNumber,byte status,string remark)。
- DeleteLiaotian(int chatID)。
上述方法的运行流程如图21-4所示。
图21-4 聊天室管理模块数据访问层运行流程图
下面分别介绍上述方法的具体实现过程。
1.方法GetUser(string username,string password)
方法GetUser(string username,string password)的功能是获取系统会员用户的信息,其具体实现过程如下。
(1)从系统配置文件Web.config中获取数据库连接参数,并将其保存在connectionString中。
(2)使用连接字符串创建con对象,实现数据库连接。
(3)新建SQL查询语句,获取数据库内会员用户的信息。
(4)创建获取数据的对象cmd。
(5)打开数据库连接,获取查询数据。
(6)将获取的查询结果保存在dr中,并返回dr。
上述过程的对应实现代码如下。
public SqlDataReader GetUser(string username,string password)
{ //获取连接字符串
string connectionString = ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRING"].Connection String;
SqlConnection con = new SqlConnection(connectionString);
//创建SQL语句
string cmdText = "SELECT ID FROM [User] WHERE Username=@Username AND Password=@Password";
SqlCommand cmd = new SqlCommand(cmdText,con);
//创建参数并赋值
cmd.Parameters.Add("@Username",SqlDbType.VarChar,50);
cmd.Parameters.Add("@Password",SqlDbType.VarChar,255);
cmd.Parameters[0].Value = username;
cmd.Parameters[1].Value = password;
//定义SqlDataReader
SqlDataReader dr;
try
{ //打开连接
con.Open();
dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch(Exception ex)
{ //抛出异常
throw new Exception(ex.Message,ex);
}
return dr;
}
2.方法GetLiaotian()
方法GetLiaotian()的功能是获取系统内所有的聊天室信息,其具体实现过程如下。
(1)从系统配置文件Web.config中获取数据库连接参数,并将其保存在connectionString中。
(2)使用连接字符串创建con对象,实现数据库连接。
(3)新建SQL查询语句,获取数据库中所有聊天室的信息。
(4)创建获取数据的对象da。
(5)打开数据库连接,获取查询数据。
(6)将获取的查询结果保存在ds中,并返回ds。
上述过程的对应实现代码如下。
public DataSet GetLiaotian()
{ //获取连接字符串
string connectionString = ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRING"].Connection String;
//创建连接
SqlConnection con = new SqlConnection(connectionString);
//创建SQL语句
string cmdText = "SELECT * FROM Chat Order by CurrentNumber 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.方法GetSingleLiaotian(int chatID)
方法GetSingleLiaotian(int chatID)的功能是获取系统内指定编号的聊天室信息,其具体实现过程如下。
(1)从系统配置文件Web.config中获取数据库连接参数,并将其保存在connectionString中。
(2)使用连接字符串创建con对象,实现数据库连接。
(3)新建SQL查询语句,获取数据库中某编号的聊天室信息。
(4)创建获取数据的对象cmd。
(5)打开数据库连接,获取查询数据。
(6)将获取的查询结果保存在dr中,并返回dr。
上述过程的对应实现代码如下。
public SqlDataReader GetSingleLiaotian(int chatID)
{ //获取连接字符串
string connectionString = ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRING"].Connection String;
SqlConnection con = new SqlConnection(connectionString);
//创建SQL语句
string cmdText = "SELECT * FROM Chat WHERE ID = @ID";
//创建SqlCommand
SqlCommand cmd = new SqlCommand(cmdText,con);
//创建参数并赋值
cmd.Parameters.Add("@ID",SqlDbType.Int,4);
cmd.Parameters[0].Value = chatID;
//定义SqlDataReader
SqlDataReader dr;
try
{
con.Open();
//读取数据
dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch(Exception ex)
{
throw new Exception(ex.Message,ex);
}
return dr;
}
4.方法AddLiaotian(string chatName,int maxNumber,byte status,string remark)
方法AddLiaotian(string chatName,int maxNumber,byte status,string remark)的功能是向系统中添加新的聊天室信息,其具体实现过程如下。
(1)从系统配置文件Web.config中获取数据库连接参数,并将其保存在connectionString中。
(2)使用连接字符串创建con对象,实现数据库连接。
(3)新建SQL插入语句,向系统数据库中添加新的聊天室信息。
(4)创建获取数据的对象cmd。
(5)打开数据库连接,执行插入操作。
(6)将操作结果保存在result中,并返回result。
上述过程的对应实现代码如下。
public int AddLiaotian(string chatName,int maxNumber,byte status,string remark)
{ //获取连接字符串
string connectionString = ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRING"].Connection String;
//创建连接
SqlConnection con = new SqlConnection(connectionString);
//创建SQL语句
string cmdText = "INSERT INTO Chat(ChatName,MaxNumber,CurrentNumber,Status,CreateDate,Remark) VALUES(@
ChatName,@MaxNumber,0,@Status,GETDATE(),@Remark)";
//创建SqlCommand
SqlCommand cmd = new SqlCommand(cmdText,con);
//创建参数并赋值
cmd.Parameters.Add("@ChatName",SqlDbType.VarChar,200);
cmd.Parameters.Add("@MaxNumber",SqlDbType.Int,4);
cmd.Parameters.Add("@Status",SqlDbType.TinyInt,1);
cmd.Parameters.Add("@Remark",SqlDbType.VarChar,1000);
cmd.Parameters[0].Value = chatName;
cmd.Parameters[1].Value = maxNumber;
cmd.Parameters[2].Value = status;
cmd.Parameters[3].Value = remark;
int result = −1;
try
{
con.Open();
result = cmd.ExecuteNonQuery();
}
catch(Exception ex)
{
throw new Exception(ex.Message,ex);
}
finally
{
con.Close();
}
return result;
}
5.方法UpdateLiaotian(int chatID,string chatName,int maxNumber,byte status,string remark)
方法UpdateLiaotian(int chatID,string chatName,int maxNumber,byte status,string remark)的功能是修改系统中某编号的聊天室信息,其具体实现过程如下。
(1)从系统配置文件Web.config中获取数据库连接参数,并将其保存在connectionString中。
(2)使用连接字符串创建con对象,实现数据库连接。
(3)新建SQL更新语句,对系统数据库中某编号的聊天室信息进行修改。
(4)创建获取数据的对象cmd。
(5)打开数据库连接,执行修改操作。
(6)将修改结果保存在result中,并返回result。
上述过程的对应实现代码如下。
public int UpdateLiaotian(int chatID,string chatName,int maxNumber,byte status,string remark)
{
string connectionString = ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRING"].Connection String;
//创建连接
SqlConnection con = new SqlConnection(connectionString);
//创建SQL语句
string cmdText = "UPDATE Chat SET ChatName=@ChatName,MaxNumber=@MaxNumber,Status=@Status,
Remark=@Remark WHERE ID=@ID";
//创建SqlCommand
SqlCommand cmd = new SqlCommand(cmdText,con);
//创建参数并赋值
cmd.Parameters.Add("@ChatName",SqlDbType.VarChar,200);
cmd.Parameters.Add("@MaxNumber",SqlDbType.Int,4);
cmd.Parameters.Add("@Status",SqlDbType.TinyInt,1);
cmd.Parameters.Add("@Remark",SqlDbType.VarChar,1000);
cmd.Parameters.Add("@ID",SqlDbType.Int,4);
cmd.Parameters[0].Value = chatName;
cmd.Parameters[1].Value = maxNumber;
cmd.Parameters[2].Value = status;
cmd.Parameters[3].Value = remark;
cmd.Parameters[4].Value = chatID;
int result = −1;
try
{
con.Open();
//操作数据
result = cmd.ExecuteNonQuery();
}
catch(Exception ex)
{
throw new Exception(ex.Message,ex);
}
finally
{
con.Close();
}
return result;
}
6.方法DeleteLiaotian(int chatID)
方法DeleteLiaotian(int chatID)的功能是删除系统内某编号的聊天室信息,其具体实现过程如下。
(1)从系统配置文件Web.config中获取数据库连接参数,并将其保存在connectionString中。
(2)使用连接字符串创建con对象,实现数据库连接。
(3)新建SQL删除语句,删除系统数据库中某编号的聊天室信息。
(4)创建获取数据的对象cmd。
(5)打开数据库连接,执行删除操作。
(6)将操作结果保存在result中,并返回result。
上述过程的对应实现代码如下。
public int DeleteLiaotian(int chatID)
{
string connectionString = ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRING"].Connection String;
SqlConnection con = new SqlConnection(connectionString);
string cmdText = "DELETE Chat WHERE ID = @ID";
//创建SqlCommand
SqlCommand cmd = new SqlCommand(cmdText,con);
//创建参数并赋值
cmd.Parameters.Add("@ID",SqlDbType.Int,4);
cmd.Parameters[0].Value = chatID;
int result = −1;
try
{
con.Open();
//操作数据
result = cmd.ExecuteNonQuery();
}
catch(Exception ex)
{
throw new Exception(ex.Message,ex);
}
finally
{
con.Close();
}
return result;
}
}
数据库技术是动态网站的根本,所以数据库的安全性就成为我们当务之急要解决的问题之一。在数据库安全问题上,大多数采用用户标识机制。用户标识是指用户向系统出示自己的身份证明,最简单的方法就是输入用户ID和密码。标识机制用于唯一标志进入系统的每个用户的身份,因此必须保证标识的唯一性。鉴别是指系统检查,验证用户的身份证明,以检验用户身份的合法性。标识和鉴别功能保证了只有合法的用户才能存取系统中的资源。
由于数据库用户的安全等级是不同的,因此分配给他们的权限也是不一样的,数据库系统必须建立严格的用户认证机制。身份的标识和鉴别是数据库管理系统(DBMS)对访问者授权的前提,并且通过审计机制使DBMS保留追究用户行为责任的能力。功能完善的标识与鉴别机制也是访问控制机制有效实施的基础,特别是在一个开放的多用户系统的网络环境中,识别与鉴别用户是构筑DBMS安全防线的1个重要环节。