[摘要] 數(shù)據(jù)庫(kù)查詢已成為當(dāng)今社會(huì)各行業(yè)不可缺少的部分,而傳統(tǒng)的數(shù)據(jù)庫(kù)并不能處理模糊現(xiàn)象,本文是在SQL的Northwind數(shù)據(jù)庫(kù)中為employees表建立新的存儲(chǔ)過(guò)程以便在.net中按Lastname進(jìn)行模糊查詢,從而克服了傳統(tǒng)查詢的局限性。
[關(guān)鍵詞] SQL 存儲(chǔ)過(guò)程 模糊查詢
一、引言
隨著信息時(shí)代的到來(lái)和Internet技術(shù)的發(fā)展,數(shù)據(jù)庫(kù)查詢已成為人們?nèi)粘I钪胁豢扇鄙俚牟糠帧S绕涫菍?duì)于企業(yè)來(lái)說(shuō),數(shù)據(jù)庫(kù)的精確查詢顯然不能滿足它的各種查詢要求,這會(huì)導(dǎo)致企業(yè)效率的不足。而現(xiàn)有查詢技術(shù)主要是以傳統(tǒng)數(shù)據(jù)庫(kù)系統(tǒng)為基礎(chǔ),僅對(duì)精確數(shù)據(jù)進(jìn)行訪問(wèn)和處理。然而在客觀世界中,模糊概念和現(xiàn)象大量存在,也就有大量非理想化或模糊的查詢操作。為了克服傳統(tǒng)查詢的局限性,需要提出一種更具“智能化”、能對(duì)模糊查詢要求快速定位的新技術(shù)。本文只是從眾多模糊查詢中提出一種——利用存儲(chǔ)過(guò)程實(shí)現(xiàn)模糊查詢。
二、相關(guān)概念
1.模糊的概念
目前主流的數(shù)據(jù)庫(kù)是關(guān)系型數(shù)據(jù)庫(kù),它是以布爾邏輯為基礎(chǔ)的,所以對(duì)于一個(gè)查詢條件,數(shù)據(jù)庫(kù)中的一條記錄要么滿足要么不滿足。
但是人類語(yǔ)言的一個(gè)很大特點(diǎn)就是具有模糊性、不確定性、不精確性,比如在數(shù)據(jù)庫(kù)中查找“一個(gè)年輕的高個(gè)男子”,在這個(gè)條件中“年輕”和“高個(gè)”是模糊的概念;另外在許多情況下,用戶對(duì)查詢并不要求給出一個(gè)精確匹配的結(jié)果,只要求結(jié)果在一定程度上滿足條件即可。這些特點(diǎn)應(yīng)該在數(shù)據(jù)庫(kù)的表達(dá)、設(shè)計(jì)以及查詢功能上得到一定的體現(xiàn)。
模糊數(shù)據(jù)表達(dá)所要解決的問(wèn)題是在傳統(tǒng)的關(guān)系模型的哪些方面引入模糊性,從而使得現(xiàn)實(shí)世界中的某些不確定或不精確信息在數(shù)據(jù)庫(kù)中得到反映。在傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)中,有三個(gè)基本的亦是隱含著的假設(shè):
(1)在任一關(guān)系(表)中的每一元組(行)中的每一個(gè)屬性(字段)的值是其值域中的單個(gè)元素。例如,若年齡的取值域是[0,200],則張三的年齡必須是[0,200]中的一個(gè)元素,如21。
(2)在任一關(guān)系(表)中的每一個(gè)元組(行)都完全隸屬于該關(guān)系(表),即每一出現(xiàn)在表中的行都與表所表達(dá)的概念完全相符。
(3)屬性(字段)的取值域中的任意兩個(gè)元素都被認(rèn)為相互間完全不同。比如年齡值域[0,200]中的21和22就被認(rèn)為是完全不同的兩個(gè)值。 針對(duì)上述三種假設(shè)的不同程度上的模糊擴(kuò)展,則形成不同的模糊數(shù)據(jù)表達(dá)模式。
模糊查詢是指通過(guò)使用模糊集合或具有模糊特征的語(yǔ)言詞對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢。也就是說(shuō),查詢標(biāo)準(zhǔn)或查詢條件可包含模糊集合或語(yǔ)言詞,而數(shù)據(jù)庫(kù)本身則可以是傳統(tǒng)(非模糊)數(shù)據(jù)庫(kù),也可是模糊數(shù)據(jù)庫(kù)。目前國(guó)際上做的較多的工作主要集中在對(duì)傳統(tǒng)數(shù)據(jù)庫(kù)的模糊查詢上。
模糊關(guān)系數(shù)據(jù)庫(kù)的設(shè)計(jì)和傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)一樣,旨在獲得合理的數(shù)據(jù)庫(kù)模式(Schema),進(jìn)而避免可能出現(xiàn)的數(shù)據(jù)冗余和修改異常。
2.2SQL數(shù)據(jù)庫(kù)的模糊查詢
SQL Server數(shù)據(jù)庫(kù)可以用SUBSTRING函數(shù)來(lái)實(shí)現(xiàn)模糊查詢,SUBSTRING函數(shù)返回一個(gè)字符串的子串(從n1開(kāi)始,共n2個(gè)字符)。其格式為:SUBSTRING(string fromn1 to n2)
如:
SELECT SUBSTRING(CUSTNAME FROM1 FOR 10) FROM CUSTOMER
其意為返回CUSTNAME的頭10個(gè)字符。但SUBSTRING函數(shù)只能實(shí)現(xiàn)一定字段的模糊查詢,而且本身區(qū)分大小寫,需在程序中增加代碼以提高其模糊度,程序代碼較長(zhǎng),比較煩瑣,用SQL的Select查詢命令則可以很容易地實(shí)現(xiàn)數(shù)據(jù)庫(kù)的查詢。
在Select命令的Where子句中使用“LIKE”關(guān)鍵詞和“%”通配符就可以做到模糊查詢。下面語(yǔ)句在my_database數(shù)據(jù)庫(kù)的Product表中查找ProductName字段的值含有“Sa”字符串的所有記錄。
Use my_database
Select * From Product
Where ProductName LIKE “%Sa%”
GO
這種模糊查詢雖然簡(jiǎn)便但效率不足,SQL Server數(shù)據(jù)庫(kù)還提供了一種叫做Stored Procedure (存儲(chǔ)過(guò)程)的數(shù)據(jù)庫(kù)對(duì)象,用戶可以將一些常用的命令過(guò)程以存儲(chǔ)過(guò)程的形式存儲(chǔ)起來(lái),需要運(yùn)行這些存儲(chǔ)過(guò)程時(shí),只要輸入存儲(chǔ)過(guò)程名即可。這樣不僅簡(jiǎn)化了操作,而且提高了效率。存儲(chǔ)過(guò)程名的選取應(yīng)符合SQL Server的命名規(guī)則,當(dāng)它以“?!遍_(kāi)頭時(shí),表示一個(gè)臨時(shí)存儲(chǔ)過(guò)程,它只在應(yīng)用程序運(yùn)行時(shí)存在,程序結(jié)束后,被自動(dòng)刪除。
下面的語(yǔ)句創(chuàng)建一個(gè)名字為#query的臨時(shí)存儲(chǔ)過(guò)程:
Create Procedure #Query
As
Select * From Product
Where ProductName LIKE “%Sa%”
三、數(shù)據(jù)庫(kù)模糊查詢的ASP實(shí)現(xiàn)方法
一般來(lái)講一個(gè)個(gè)簡(jiǎn)單的利用存儲(chǔ)過(guò)程實(shí)現(xiàn)模糊查詢分以下五步部組成:
1.建立存儲(chǔ)過(guò)程
在SQL中的Northwind數(shù)據(jù)庫(kù)中為employess表新建存儲(chǔ)過(guò)程:
CREATE PROCEDURE Employees_Sel @lastname nvarchar (20)
AS
select lastname from Employees where lastname like ‘%’ + @lastname + ‘%’
GO
2.窗體設(shè)計(jì)
(1)新建ASP.NET Web應(yīng)用程序,命名為WebSql,選擇保存路徑然后點(diǎn)擊確定。
(2)向窗體中添加一個(gè)Label、一個(gè)Textbox和一個(gè)Button按鈕,然后再添加一個(gè)DataGrid控件,右擊DataGrid控件選擇屬性生成器,然后在打開(kāi)的窗口中選擇列,去掉自動(dòng)創(chuàng)建列前的對(duì)勾,再向選定列中添加一個(gè)綁定列將頁(yè)眉設(shè)為L(zhǎng)astName,將數(shù)據(jù)字段設(shè)為L(zhǎng)astName點(diǎn)擊確定。
3.創(chuàng)建中間數(shù)據(jù)層
右擊解決方案,選擇新建-項(xiàng)目-類庫(kù),名稱為ClaSQL,選擇保存路徑然后點(diǎn)擊確定。在打開(kāi)的類庫(kù)中添加以下代碼:
Imports System.Data.SqlClient
Public Class Class1
Dim scom As New SqlConnection(“server
=localhost;database=northwind;uid=sa;pwd=123”)
//創(chuàng)建一個(gè)進(jìn)行查詢的過(guò)程
Public Function Emp_Sel(ByVal lastname As String) As DataSet
scon.Open()
scon.Close()
//定義命令對(duì)象,并使用儲(chǔ)存過(guò)程
Dim scom As New SqlCommand
scom.CommandType=CommandType.StoredProcedure
scom.CommandText = “Employess_Sel”
scom.Connection = scon
//定義一個(gè)數(shù)據(jù)適配器,并設(shè)置參數(shù)
Dim sda As New SqlDataAdapter(scom)
sda.SelectCommand.Parameters.Add(\"@lastname\", SqlDbType.NVarChar).Value = lastname
//定義一個(gè)數(shù)據(jù)集對(duì)象,并填充數(shù)據(jù)集
Dim ds As New DataSet
Try
sda.Fill(ds)
Catch ex As Exception
End Try
Return ds
End Function
End Class
4.引用中間數(shù)據(jù)層
在ClaSql項(xiàng)目上右擊,選擇生成,然后在WebSql項(xiàng)目的“引用”上右擊,選擇添加引用,再選擇項(xiàng)目,將ClaSql項(xiàng)目添加到選定的組件框中,然后點(diǎn)擊確定。
5.WebForm1.aspx窗體代碼設(shè)計(jì)
打開(kāi)WebSql項(xiàng)目下的WebForm1.aspx文件,雙擊Button按鈕打開(kāi)代碼窗口,完整的代碼如下:
Public Class WebForm1
Inherits System.Web.UI.Page
//窗體代碼略
//搜索按鈕事件
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
//定義變量?jī)?chǔ)存文本框的輸入,出于安全的目的對(duì)其進(jìn)行轉(zhuǎn)換
Dim lastname As String = TextBox1.Text
lastname = lastname.Replace(“”, “”)
lastname = lastname.Replace(“<“, “”)
lastname = lastname.Replace(“>”, “”)
lastname = lastname.Replace(“’”, “’”)
lastname=lastname.Replace(“chr(13)”,”
”)
lastname=lastname.Replace(“chr(10)”,”
”)
//創(chuàng)建一個(gè)新的類實(shí)例,并調(diào)用查詢過(guò)程綁定數(shù)據(jù)
Dim myCla As New ClaSql.Class1
DataGrid1.DataSource= myCla.Emp_Sel(lastname)
DataGrid1.DataBind()
End Sub
End Class
由于存儲(chǔ)過(guò)程具有存儲(chǔ)過(guò)程允許標(biāo)準(zhǔn)組件式編程、存儲(chǔ)過(guò)程能夠?qū)崿F(xiàn)較快的執(zhí)行速度、存儲(chǔ)過(guò)程能夠減少網(wǎng)絡(luò)流量以及存儲(chǔ)過(guò)程可被作為一種安全機(jī)制來(lái)充分利用等的優(yōu)點(diǎn),所以任何一個(gè)設(shè)計(jì)良好的數(shù)據(jù)庫(kù)應(yīng)用程序都應(yīng)該用到存儲(chǔ)過(guò)程,但是其中也存在著許多安全隱憂,因此在對(duì)數(shù)據(jù)庫(kù)操作中應(yīng)盡量采取一些措施,如使用儲(chǔ)存過(guò)程要使用復(fù)雜賬戶的密碼、對(duì)每個(gè)不同賬戶只設(shè)置相應(yīng)的插入或刪除等權(quán)限以及對(duì)數(shù)據(jù)庫(kù)的操作應(yīng)該盡量將其封裝到中間層(類庫(kù))中等等,這樣即可以實(shí)現(xiàn)代碼的重用,也方便以后的進(jìn)行修改。
四、小結(jié)
通過(guò)對(duì)三種SQL模糊數(shù)據(jù)庫(kù)的查詢比較,總結(jié)出利用存儲(chǔ)過(guò)程實(shí)現(xiàn)模糊查詢的可取之處,并給出了實(shí)現(xiàn)方法,方便了企業(yè)數(shù)據(jù)庫(kù)的查詢,提高了效率。對(duì)于存在的不安全因素也給出了可行性建議。今后還需對(duì)模糊數(shù)據(jù)的操作和完整性約束等方面進(jìn)行研究。
參考文獻(xiàn):
[1]何新貴:模糊數(shù)據(jù)庫(kù)系統(tǒng)[M].清華大學(xué)出版社,1994年12月
[2]劉應(yīng)明任平:模糊性——精確性的另一半[M].清華大學(xué)出版社,2000年12月
[3]蘇嘯:數(shù)據(jù)庫(kù)原理與SQL Server 2000教程[M].北京工業(yè)大學(xué)出版社,2002,256~271
[4]李蘭友楊曉光:ASP.NET實(shí)用程序設(shè)計(jì)[M].北京交通大學(xué)出版社,2005,95~176
[5]管清波:用SQL語(yǔ)句實(shí)現(xiàn)查詢的方法[J].開(kāi)發(fā)經(jīng)驗(yàn)