时间:2022-10-06 12:13:35
摘要:数据库设计是基于Web的图书馆管理系统开发的基础。分析数据库的逻辑设计,详细描述存储过程的创建,对图书馆管理系统的开发有一定借鉴意义。
关键词:逻辑设计;存储过程;数据访问
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2014)03-0437-06
1 数据库设计
1.1数据库逻辑设计
1)用户表(Users)
2)图书表(Book)
3)图书借阅表(Borrow)
4)权限表(Power)
1.2 数据关系图
为保证数据的完整性和有效性,为Borrow数据表增加两个外键关系,并设置外键关系对复制、插入、更好的强制关系,而且级联更新和删除相关字段。
2 创建存储过程
2.1什么是存储过程
存储过程是利用SQL Server所提供的Tranact-SQL语言所编写的程序。Tranact-SQL语言是SQL Server提供专为设计数据库应用程序的语言,它是应用程序和SQL Server数据库间的主要程序式设计界面。存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。在本系统中大量使用了存储过程,实现对信息的添加、修改、查询、删除等操作,提高了数据库执行速度,可以很好地优化系统。这类语言主要提供以下功能,让用户可以设计出符合引用需求的程序:
1) 变量说明
2) ANSI兼容的SQL命令(如Select、Update….)
3) 一般流程控制命令(if…else…、while….)
4) 内部函数
其中每个参数名前要有一个“@”符号,每一个存储过程的参数仅为该程序内部使用,参数的类型除了IMAGE外,其他SQL Server所支持的数据类型都可使用。
2.2详细存储过程
1)Proc_BookAdd
功能:往Book表中插入新的图书信息。过程操作面向总图书管理员。
CREATE PROCEDURE [Proc_BookAdd]
(@BookName [varchar](50),
@BookISBN [varchar](50),
@BookAuthor [varchar](50),
…… \\依次插入各字段,此处已省略
@BookDescription [text])
AS INSERT INTO [MyLibrary].[dbo].[Book]
([BookName],
[BookISBN],
[BookAuthor],
…… \\依次插入各字段,此处已省略
[BookDescription])
VALUES
(@BookName,
@BookISBN,
@BookAuthor,
…… \\依次插入各字段,此处已省略
@BookDescription)
GO
2) Proc_BookDelete
功能:删除Book表中指定的图书信息。过程操作面向总图书管理员。
create PROCEDURE [Proc_BookDelete]
(@BookID [int])
AS DELETE [MyLibrary].[dbo].[Book]
WHERE
( [BookID] = @BookID)
GO
3)Proc_BookList
功能:查询Book表中的所有图书信息,并以书号排序。过程面向总图书管理员。
create PROCEDURE [Proc_BookList]
AS SELECT *
FROM [dbo].[Book]
ORDER BY BookID
GO
4)Proc_BookModify
功能:对Book表中的某本图书的信息进行修改。过程操作面向总图书管理员。
AS UPDATE [MyLibrary].[dbo].[Book]
SET [BookName] =@BookName,
[BookISBN] =@BookISBN,
[BookAuthor] =@BookAuthor,
…… \\依次输入各条信息的修改,此处已省略
[BookDescription] =@BookDescription
WHERE
( [BookID] = @BookID)
3 数据访问层
本层只包含一个类Database,基本都是使用存储过程来操作数据。
3.1配置数据库连接
在Web.config文件中指定了数据库连接字符串配置信息,具体实现为,在Web.config文件中添加如下代码:
providerName="System.Data.SqlClient" />
3.2 DataBase类成员一览
DataBase类完成所有的数据操作,位于MyLibrary.DataAcceessLayer空间下。其类图如图2所示。
图2
DataBase类的成员说明
[ 属性/方法\& 功能说明\&Connection\&私有变量,数据库连接SqlConnection对象\&ConnectionString\&私有变量,数据库连接串\&Open\&打开数据库连接\&Close\&关闭数据库连接\&Dispose\&释放数据库连接资源\&GetRecord\&公有方法,根据Sql语句,返回是否查询到记录\&GetRecordCount\&公有方法,返回Sql语句获得的数据值\&AdvancedSearch\&公有方法,根据XWhere更新数据表XTableName中的某些纪录\&CreateCommand\&私有方法,获得一个用来调用存储过程的SqlCommand\&MakeParam\&公有方法,实例化一个用于调用存储过程的参数\&MakeInParam\&公有方法,实例化一个用于调用存储过程的输入参数\&RunProc\&公有方法,调用存储过程(不带参数)\&RunProc\&公有方法,调用存储过程(带参数)\&RunProcGetReader\&公有方法,调用存储过程(不带参数)\&RunProcGetReader\&公有方法,调用存储过程(带参数)\&RunProcGetCount\&公有方法,调用存储过程(带参数)\&GetDataSet\&公有方法,调用存储过程(不带参数)\&GetDataSet\&公有方法,调用存储过程(不带参数)\&]
3.3 实现DataBase类
下面介绍主要方法的实现:
1)GetRecord(string XSqlString)方法
功能:根据传递过来的SQL语句,查询要查询的记录是否存在,如果查询到,返回真,否则返回假。实现代码参考如下:
//公有方法,根据Sql语句,返回是否查询到记录
public bool GetRecord(string XSqlString)
{
Open();//连接数据库
SqlDataAdapter adapter = new SqlDataAdapter(XSqlString, Connection);
//实例化一个SQLDataAdapter对象
DataSet dataset = new DataSet();//创建一个数据集实例
adapter.Fill(dataset);//向数据集中填充数据
Close();//关闭数据库
if (dataset.Tables[0].Rows.Count > 0)//判断是否查询到记录,如果查询到返回真,否则返回假
{
return true;
}
else
{
return false;
}
2)AdvancedSearch(string XTableName, Hashtable XHT)方法
AdvancedSearch方法使用一个哈希表结构,从指定的数据库中查询记录。方法流程如图所示:
图3
public DataSet AdvancedSearch(string XTableName, Hashtable XHT)
{
int Count = 0;
string Fields = "";
foreach(DictionaryEntry Item in XHT)
{
if (Count != 0)
{
Fields += " and ";
}
Fields += Item.Key.ToString(); //模糊查询
Fields += " like '%";
Fields += Item.Value.ToString();
Fields += "%'";
Count++;
}
Fields += " ";
string SqlString = "select * from " + XTableName + " where " + Fields;
Open();
SqlDataAdapter Adapter = new SqlDataAdapter(SqlString, Connection);
DataSet Ds = new DataSet();
Adapter.Fill(Ds);
Close();
return Ds;
}
3)RunProc方法
该方法执行传递过来的存储过程,执行存储过程时有需要参数的情况,也有不需要参数的情况,所以对该方法进行重载,执行存储过程,返回执行结果。
public int RunProc(string ProcName)
{
int Count = -1;
SqlCommand Cmd = CreateCommand(ProcName, null);
Count = Cmd.ExecuteNonQuery();
Close();
return Count;
}
4)GetDataSet方法
该方法根基传递过来的存储过程,从数据库中查询记录,返回查询结果的数据库,传递过来的存储过程也有两种情况:带参数和不带参数,对应方法有两种形式。
public DataSet GetDataSet(string ProcName)
{
Open();
SqlDataAdapter adapter = new SqlDataAdapter(ProcName, Connection);
DataSet dataset = new DataSet();
adapter.Fill(dataset);
Close();
return dataset;
}
参考文献:
[1] 刘捷,张琳,温才 2.0+SQL Server动态网站开发从基础到实践[M].北京:电子工业出版社,2007.
[2] 刘亚姝,许小荣,张玉梅.ASP动态网站开发技术与实践[M].北京:电子工业出版社,2007.