摘要:數(shù)據(jù)庫設(shè)計(jì)是基于Web的圖書館管理系統(tǒng)開發(fā)的基礎(chǔ)。分析數(shù)據(jù)庫的邏輯設(shè)計(jì),詳細(xì)描述存儲(chǔ)過程的創(chuàng)建,對(duì)圖書館管理系統(tǒng)的開發(fā)有一定借鑒意義。
關(guān)鍵詞:邏輯設(shè)計(jì);存儲(chǔ)過程;數(shù)據(jù)訪問
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2014)03-0437-06
1 數(shù)據(jù)庫設(shè)計(jì)
1.1數(shù)據(jù)庫邏輯設(shè)計(jì)
1)用戶表(Users)
2)圖書表(Book)
3)圖書借閱表(Borrow)
4)權(quán)限表(Power)
1.2 數(shù)據(jù)關(guān)系圖
為保證數(shù)據(jù)的完整性和有效性,為Borrow數(shù)據(jù)表增加兩個(gè)外鍵關(guān)系,并設(shè)置外鍵關(guān)系對(duì)復(fù)制、插入、更好的強(qiáng)制關(guān)系,而且級(jí)聯(lián)更新和刪除相關(guān)字段。
2 創(chuàng)建存儲(chǔ)過程
2.1什么是存儲(chǔ)過程
存儲(chǔ)過程是利用SQL Server所提供的Tranact-SQL語言所編寫的程序。Tranact-SQL語言是SQL Server提供專為設(shè)計(jì)數(shù)據(jù)庫應(yīng)用程序的語言,它是應(yīng)用程序和SQL Server數(shù)據(jù)庫間的主要程序式設(shè)計(jì)界面。存儲(chǔ)過程只在創(chuàng)造時(shí)進(jìn)行編譯,以后每次執(zhí)行存儲(chǔ)過程都不需再重新編譯,而一般SQL語句每執(zhí)行一次就編譯一次,所以使用存儲(chǔ)過程可提高數(shù)據(jù)庫執(zhí)行速度。在本系統(tǒng)中大量使用了存儲(chǔ)過程,實(shí)現(xiàn)對(duì)信息的添加、修改、查詢、刪除等操作,提高了數(shù)據(jù)庫執(zhí)行速度,可以很好地優(yōu)化系統(tǒng)。這類語言主要提供以下功能,讓用戶可以設(shè)計(jì)出符合引用需求的程序:
1) 變量說明
2) ANSI兼容的SQL命令(如Select、Update….)
3) 一般流程控制命令(if…else…、while….)
4) 內(nèi)部函數(shù)
其中每個(gè)參數(shù)名前要有一個(gè)“@”符號(hào),每一個(gè)存儲(chǔ)過程的參數(shù)僅為該程序內(nèi)部使用,參數(shù)的類型除了IMAGE外,其他SQL Server所支持的數(shù)據(jù)類型都可使用。
2.2詳細(xì)存儲(chǔ)過程
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表中的所有圖書信息,并以書號(hào)排序。過程面向總圖書管理員。
create PROCEDURE [Proc_BookList]
AS SELECT *
FROM [dbo].[Book]
ORDER BY BookID
GO
4)Proc_BookModify
功能:對(duì)Book表中的某本圖書的信息進(jìn)行修改。過程操作面向總圖書管理員。
AS UPDATE [MyLibrary].[dbo].[Book]
SET [BookName] =@BookName,
[BookISBN] =@BookISBN,
[BookAuthor] =@BookAuthor,
…… \\依次輸入各條信息的修改,此處已省略
[BookDescription] =@BookDescription
WHERE
( [BookID] = @BookID)
3 數(shù)據(jù)訪問層
本層只包含一個(gè)類Database,基本都是使用存儲(chǔ)過程來操作數(shù)據(jù)。
3.1配置數(shù)據(jù)庫連接
在Web.config文件中指定了數(shù)據(jù)庫連接字符串配置信息,具體實(shí)現(xiàn)為,在Web.config文件中添加如下代碼:
providerName="System.Data.SqlClient" />
3.2 DataBase類成員一覽
DataBase類完成所有的數(shù)據(jù)操作,位于MyLibrary.DataAcceessLayer空間下。其類圖如圖2所示。
圖2
DataBase類的成員說明
[ 屬性/方法\& 功能說明\&Connection\&私有變量,數(shù)據(jù)庫連接SqlConnection對(duì)象\&ConnectionString\&私有變量,數(shù)據(jù)庫連接串\&Open\&打開數(shù)據(jù)庫連接\&Close\&關(guān)閉數(shù)據(jù)庫連接\&Dispose\&釋放數(shù)據(jù)庫連接資源\&GetRecord\&公有方法,根據(jù)Sql語句,返回是否查詢到記錄\&GetRecordCount\&公有方法,返回Sql語句獲得的數(shù)據(jù)值\&AdvancedSearch\&公有方法,根據(jù)XWhere更新數(shù)據(jù)表XTableName中的某些紀(jì)錄\&CreateCommand\&私有方法,獲得一個(gè)用來調(diào)用存儲(chǔ)過程的SqlCommand\&MakeParam\&公有方法,實(shí)例化一個(gè)用于調(diào)用存儲(chǔ)過程的參數(shù)\&MakeInParam\&公有方法,實(shí)例化一個(gè)用于調(diào)用存儲(chǔ)過程的輸入?yún)?shù)\&RunProc\&公有方法,調(diào)用存儲(chǔ)過程(不帶參數(shù))\&RunProc\&公有方法,調(diào)用存儲(chǔ)過程(帶參數(shù))\&RunProcGetReader\&公有方法,調(diào)用存儲(chǔ)過程(不帶參數(shù))\&RunProcGetReader\&公有方法,調(diào)用存儲(chǔ)過程(帶參數(shù))\&RunProcGetCount\&公有方法,調(diào)用存儲(chǔ)過程(帶參數(shù))\&GetDataSet\&公有方法,調(diào)用存儲(chǔ)過程(不帶參數(shù))\&GetDataSet\&公有方法,調(diào)用存儲(chǔ)過程(不帶參數(shù))\&]
3.3 實(shí)現(xiàn)DataBase類
下面介紹主要方法的實(shí)現(xiàn):
1)GetRecord(string XSqlString)方法
功能:根據(jù)傳遞過來的SQL語句,查詢要查詢的記錄是否存在,如果查詢到,返回真,否則返回假。實(shí)現(xiàn)代碼參考如下:
//公有方法,根據(jù)Sql語句,返回是否查詢到記錄
public bool GetRecord(string XSqlString)
{
Open();//連接數(shù)據(jù)庫
SqlDataAdapter adapter = new SqlDataAdapter(XSqlString, Connection);
//實(shí)例化一個(gè)SQLDataAdapter對(duì)象
DataSet dataset = new DataSet();//創(chuàng)建一個(gè)數(shù)據(jù)集實(shí)例
adapter.Fill(dataset);//向數(shù)據(jù)集中填充數(shù)據(jù)
Close();//關(guān)閉數(shù)據(jù)庫
if (dataset.Tables[0].Rows.Count > 0)//判斷是否查詢到記錄,如果查詢到返回真,否則返回假
{
return true;
}
else
{
return false;
}
2)AdvancedSearch(string XTableName, Hashtable XHT)方法
AdvancedSearch方法使用一個(gè)哈希表結(jié)構(gòu),從指定的數(shù)據(jù)庫中查詢記錄。方法流程如圖所示:
圖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方法
該方法執(zhí)行傳遞過來的存儲(chǔ)過程,執(zhí)行存儲(chǔ)過程時(shí)有需要參數(shù)的情況,也有不需要參數(shù)的情況,所以對(duì)該方法進(jìn)行重載,執(zhí)行存儲(chǔ)過程,返回執(zhí)行結(jié)果。
public int RunProc(string ProcName)
{
int Count = -1;
SqlCommand Cmd = CreateCommand(ProcName, null);
Count = Cmd.ExecuteNonQuery();
Close();
return Count;
}
4)GetDataSet方法
該方法根基傳遞過來的存儲(chǔ)過程,從數(shù)據(jù)庫中查詢記錄,返回查詢結(jié)果的數(shù)據(jù)庫,傳遞過來的存儲(chǔ)過程也有兩種情況:帶參數(shù)和不帶參數(shù),對(duì)應(yīng)方法有兩種形式。
public DataSet GetDataSet(string ProcName)
{
Open();
SqlDataAdapter adapter = new SqlDataAdapter(ProcName, Connection);
DataSet dataset = new DataSet();
adapter.Fill(dataset);
Close();
return dataset;
}
參考文獻(xiàn):
[1] 劉捷,張琳,溫才燚.ASP.NET 2.0+SQL Server動(dòng)態(tài)網(wǎng)站開發(fā)從基礎(chǔ)到實(shí)踐[M].北京:電子工業(yè)出版社,2007.
[2] 劉亞姝,許小榮,張玉梅.ASP動(dòng)態(tài)網(wǎng)站開發(fā)技術(shù)與實(shí)踐[M].北京:電子工業(yè)出版社,2007.
providerName="System.Data.SqlClient" />
3.2 DataBase類成員一覽
DataBase類完成所有的數(shù)據(jù)操作,位于MyLibrary.DataAcceessLayer空間下。其類圖如圖2所示。
圖2
DataBase類的成員說明
[ 屬性/方法\& 功能說明\&Connection\&私有變量,數(shù)據(jù)庫連接SqlConnection對(duì)象\&ConnectionString\&私有變量,數(shù)據(jù)庫連接串\&Open\&打開數(shù)據(jù)庫連接\&Close\&關(guān)閉數(shù)據(jù)庫連接\&Dispose\&釋放數(shù)據(jù)庫連接資源\&GetRecord\&公有方法,根據(jù)Sql語句,返回是否查詢到記錄\&GetRecordCount\&公有方法,返回Sql語句獲得的數(shù)據(jù)值\&AdvancedSearch\&公有方法,根據(jù)XWhere更新數(shù)據(jù)表XTableName中的某些紀(jì)錄\&CreateCommand\&私有方法,獲得一個(gè)用來調(diào)用存儲(chǔ)過程的SqlCommand\&MakeParam\&公有方法,實(shí)例化一個(gè)用于調(diào)用存儲(chǔ)過程的參數(shù)\&MakeInParam\&公有方法,實(shí)例化一個(gè)用于調(diào)用存儲(chǔ)過程的輸入?yún)?shù)\&RunProc\&公有方法,調(diào)用存儲(chǔ)過程(不帶參數(shù))\&RunProc\&公有方法,調(diào)用存儲(chǔ)過程(帶參數(shù))\&RunProcGetReader\&公有方法,調(diào)用存儲(chǔ)過程(不帶參數(shù))\&RunProcGetReader\&公有方法,調(diào)用存儲(chǔ)過程(帶參數(shù))\&RunProcGetCount\&公有方法,調(diào)用存儲(chǔ)過程(帶參數(shù))\&GetDataSet\&公有方法,調(diào)用存儲(chǔ)過程(不帶參數(shù))\&GetDataSet\&公有方法,調(diào)用存儲(chǔ)過程(不帶參數(shù))\&]
3.3 實(shí)現(xiàn)DataBase類
下面介紹主要方法的實(shí)現(xiàn):
1)GetRecord(string XSqlString)方法
功能:根據(jù)傳遞過來的SQL語句,查詢要查詢的記錄是否存在,如果查詢到,返回真,否則返回假。實(shí)現(xiàn)代碼參考如下:
//公有方法,根據(jù)Sql語句,返回是否查詢到記錄
public bool GetRecord(string XSqlString)
{
Open();//連接數(shù)據(jù)庫
SqlDataAdapter adapter = new SqlDataAdapter(XSqlString, Connection);
//實(shí)例化一個(gè)SQLDataAdapter對(duì)象
DataSet dataset = new DataSet();//創(chuàng)建一個(gè)數(shù)據(jù)集實(shí)例
adapter.Fill(dataset);//向數(shù)據(jù)集中填充數(shù)據(jù)
Close();//關(guān)閉數(shù)據(jù)庫
if (dataset.Tables[0].Rows.Count > 0)//判斷是否查詢到記錄,如果查詢到返回真,否則返回假
{
return true;
}
else
{
return false;
}
2)AdvancedSearch(string XTableName, Hashtable XHT)方法
AdvancedSearch方法使用一個(gè)哈希表結(jié)構(gòu),從指定的數(shù)據(jù)庫中查詢記錄。方法流程如圖所示:
圖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方法
該方法執(zhí)行傳遞過來的存儲(chǔ)過程,執(zhí)行存儲(chǔ)過程時(shí)有需要參數(shù)的情況,也有不需要參數(shù)的情況,所以對(duì)該方法進(jìn)行重載,執(zhí)行存儲(chǔ)過程,返回執(zhí)行結(jié)果。
public int RunProc(string ProcName)
{
int Count = -1;
SqlCommand Cmd = CreateCommand(ProcName, null);
Count = Cmd.ExecuteNonQuery();
Close();
return Count;
}
4)GetDataSet方法
該方法根基傳遞過來的存儲(chǔ)過程,從數(shù)據(jù)庫中查詢記錄,返回查詢結(jié)果的數(shù)據(jù)庫,傳遞過來的存儲(chǔ)過程也有兩種情況:帶參數(shù)和不帶參數(shù),對(duì)應(yīng)方法有兩種形式。
public DataSet GetDataSet(string ProcName)
{
Open();
SqlDataAdapter adapter = new SqlDataAdapter(ProcName, Connection);
DataSet dataset = new DataSet();
adapter.Fill(dataset);
Close();
return dataset;
}
參考文獻(xiàn):
[1] 劉捷,張琳,溫才燚.ASP.NET 2.0+SQL Server動(dòng)態(tài)網(wǎng)站開發(fā)從基礎(chǔ)到實(shí)踐[M].北京:電子工業(yè)出版社,2007.
[2] 劉亞姝,許小榮,張玉梅.ASP動(dòng)態(tài)網(wǎng)站開發(fā)技術(shù)與實(shí)踐[M].北京:電子工業(yè)出版社,2007.
providerName="System.Data.SqlClient" />
3.2 DataBase類成員一覽
DataBase類完成所有的數(shù)據(jù)操作,位于MyLibrary.DataAcceessLayer空間下。其類圖如圖2所示。
圖2
DataBase類的成員說明
[ 屬性/方法\& 功能說明\&Connection\&私有變量,數(shù)據(jù)庫連接SqlConnection對(duì)象\&ConnectionString\&私有變量,數(shù)據(jù)庫連接串\&Open\&打開數(shù)據(jù)庫連接\&Close\&關(guān)閉數(shù)據(jù)庫連接\&Dispose\&釋放數(shù)據(jù)庫連接資源\&GetRecord\&公有方法,根據(jù)Sql語句,返回是否查詢到記錄\&GetRecordCount\&公有方法,返回Sql語句獲得的數(shù)據(jù)值\&AdvancedSearch\&公有方法,根據(jù)XWhere更新數(shù)據(jù)表XTableName中的某些紀(jì)錄\&CreateCommand\&私有方法,獲得一個(gè)用來調(diào)用存儲(chǔ)過程的SqlCommand\&MakeParam\&公有方法,實(shí)例化一個(gè)用于調(diào)用存儲(chǔ)過程的參數(shù)\&MakeInParam\&公有方法,實(shí)例化一個(gè)用于調(diào)用存儲(chǔ)過程的輸入?yún)?shù)\&RunProc\&公有方法,調(diào)用存儲(chǔ)過程(不帶參數(shù))\&RunProc\&公有方法,調(diào)用存儲(chǔ)過程(帶參數(shù))\&RunProcGetReader\&公有方法,調(diào)用存儲(chǔ)過程(不帶參數(shù))\&RunProcGetReader\&公有方法,調(diào)用存儲(chǔ)過程(帶參數(shù))\&RunProcGetCount\&公有方法,調(diào)用存儲(chǔ)過程(帶參數(shù))\&GetDataSet\&公有方法,調(diào)用存儲(chǔ)過程(不帶參數(shù))\&GetDataSet\&公有方法,調(diào)用存儲(chǔ)過程(不帶參數(shù))\&]
3.3 實(shí)現(xiàn)DataBase類
下面介紹主要方法的實(shí)現(xiàn):
1)GetRecord(string XSqlString)方法
功能:根據(jù)傳遞過來的SQL語句,查詢要查詢的記錄是否存在,如果查詢到,返回真,否則返回假。實(shí)現(xiàn)代碼參考如下:
//公有方法,根據(jù)Sql語句,返回是否查詢到記錄
public bool GetRecord(string XSqlString)
{
Open();//連接數(shù)據(jù)庫
SqlDataAdapter adapter = new SqlDataAdapter(XSqlString, Connection);
//實(shí)例化一個(gè)SQLDataAdapter對(duì)象
DataSet dataset = new DataSet();//創(chuàng)建一個(gè)數(shù)據(jù)集實(shí)例
adapter.Fill(dataset);//向數(shù)據(jù)集中填充數(shù)據(jù)
Close();//關(guān)閉數(shù)據(jù)庫
if (dataset.Tables[0].Rows.Count > 0)//判斷是否查詢到記錄,如果查詢到返回真,否則返回假
{
return true;
}
else
{
return false;
}
2)AdvancedSearch(string XTableName, Hashtable XHT)方法
AdvancedSearch方法使用一個(gè)哈希表結(jié)構(gòu),從指定的數(shù)據(jù)庫中查詢記錄。方法流程如圖所示:
圖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方法
該方法執(zhí)行傳遞過來的存儲(chǔ)過程,執(zhí)行存儲(chǔ)過程時(shí)有需要參數(shù)的情況,也有不需要參數(shù)的情況,所以對(duì)該方法進(jìn)行重載,執(zhí)行存儲(chǔ)過程,返回執(zhí)行結(jié)果。
public int RunProc(string ProcName)
{
int Count = -1;
SqlCommand Cmd = CreateCommand(ProcName, null);
Count = Cmd.ExecuteNonQuery();
Close();
return Count;
}
4)GetDataSet方法
該方法根基傳遞過來的存儲(chǔ)過程,從數(shù)據(jù)庫中查詢記錄,返回查詢結(jié)果的數(shù)據(jù)庫,傳遞過來的存儲(chǔ)過程也有兩種情況:帶參數(shù)和不帶參數(shù),對(duì)應(yīng)方法有兩種形式。
public DataSet GetDataSet(string ProcName)
{
Open();
SqlDataAdapter adapter = new SqlDataAdapter(ProcName, Connection);
DataSet dataset = new DataSet();
adapter.Fill(dataset);
Close();
return dataset;
}
參考文獻(xiàn):
[1] 劉捷,張琳,溫才燚.ASP.NET 2.0+SQL Server動(dòng)態(tài)網(wǎng)站開發(fā)從基礎(chǔ)到實(shí)踐[M].北京:電子工業(yè)出版社,2007.
[2] 劉亞姝,許小榮,張玉梅.ASP動(dòng)態(tài)網(wǎng)站開發(fā)技術(shù)與實(shí)踐[M].北京:電子工業(yè)出版社,2007.