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