摘 要:本文首先介绍了数据库编程的基本内容,然后结合作者的编程实践,给出了一种行之有效的数据库多条件模糊查询方法,做到了ASP和SQL Server的完美结合。
关键词:ASP SQL Server数据库 编程
一、引言
贵刊第八期《利用ASP对数据库进行模糊查询和分页显示》一文提供了一种数据库模糊查询的方法。我在编程实践中利用数据库的存储过程对象实现了同样的功能。由于存储过程比一般的SQL命令更高效,所以当数据库记录很多时,利用存储过程可能是一种更好的方法。本文实现的多条件查询,可以输入任意个条件,更加灵活方便。
二、SQL Server数据库的模糊查询
所用的实例数据库名为authodb,表authos的结构为:
字段名 类型 描述
Name char 主键
Sex char
Birthday datetime
Address char
Telephone char
SQL Server 数据库的Select查询命令可以实现数据库的查询。在Select命令的Where子句中使用“LIKE”关键词和“%”通配符就可以做到模糊查询。下面语句在authodb数据库的authors表中查找Name字段的值含有“Smith”字符串的所有记录。
Use authodb
Select * From authors
Where Name LIKE “%Smith%”
GO
SQL Server数据库提供了一种叫做Stored Procedure(存储过程)的数据库对象,用户可以将一些常用的命令过程以存储过程的形式存储起来,需要运行这些存储过程时,只要输入存储过程名即可。这样不仅简化了操作,而且提高了效率(存储过程的运行比一个个的命令高效得多)。存储过程名的选取应符合SQL Server的命名规则,当它以”#”开头时,表示一个临时存储过程,它只在应用程序运行时存在,程序结束后,被自动删除。
下面的语句创建一个名字为#query的临时存储过程:
Create Procedure #Query
As
Select * From authors
Where Name LIKE “%Smith%”
运行存储过程#query同样可以查询Name字段中含用”Smith”的记录。
三、数据库模糊查询的ASP实现
利用ADO组件的Connection对象、RecordSet对象分别动态创建、运行数据库的临时存储过程对象,不仅实现了多条件模糊查询,而且交互性极强。下面我就详细地介绍给大家,希望能对你们有所帮助。
(1)创建一个用户交互页面INPUT.HTM:
<html>
<head>
<title>用户输入界面</title></head>
<body>
<center><font face="隶书" size=+3>数据库查询</font></center>
<form method="post" action="query.asp">
按字段<select name="leixing" size=”5” multiple>
<option value="Name”>姓名</option>
<option value="sex">性别</option>
<option value="birthday">生日</option>
<option value=”address”>住址</option>
<option value=”telephone”>电话</option>
</select>进行查询<br>
<font size=-2>条件间用中文","隔开,按上表的顺序依次输入<BR>
例如:“马刚勇,男,73/1/19”</font><br>
关键词<input type="text" name="keyword" size=40 value=”马刚勇“><br>
<input type="submit" value="查询">
<input type="reset" value="清除">
</form>
</body>
</html>
当用户在此客户端页面上输入数据后,这些数据通过Form数据集合由“POST”方法传递到服务器端的query.asp页面。由query.asp来完成查询功能。
(2)修改Global.asa文件,以初始化”num”变量,并将session对象的timeout属性设为120分钟。
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
SUB Session_OnStart
session("num")=0
session.timeout=120
END SUB
SUB Session_OnEnd
session.timeout=5
END SUB
</SCRIPT>
(3)创建Query.asp文件,实现模糊查询
<html>
<head>
<title>多条件模糊查询</title>
</head>
<body>
<%
response.write "<center><font face=""隶书""size=+2>查询结果</font></center>"
'--------------------- 获取Form数据 -------------------
DIM qucol(20)
DIM str,str2,length,strt,location
DIM key(10),str4(10),quenum,str5
for I=1 to request.form("leixing").count
qucol(I)=request.form("leixing")(I)
next
str=request.form("keyword")
str2=","
length=len(str)
While Instr(length,str,str2)<>0
Str=mid(str,1,length-1)
Length=length-1
Wend
strt=1
I=1
while Instr(strt,str,str2)<>0
location= Instr(strt,str,str2)
key(I)=mid(str,strt,location-strt)
str=mid(str,location+1,length-location)
I=I+1
Wend
if Instr(strt,str,str2)=0 then
key(I)=str
end if
if I<>request.form("leixing").count then
response.write"<center><font size=+2 face=""黑体"">"&_
"错误:</font><font size=+1>你输入的条件数和选择的类型数不相等!<br><br>"&_
"</font></center>"
else
'--------------- 生成Where子句-------------------
quenum=I
for I=1 to quenum
str4(I)=qucol(I)&" LIKE "&"""%"&key(I)&"%"""
next
str5=str4(1)
for I=2 to quenum
str5=str5&" AND "&str4(I)
next
'建立数据库连接。carlos:数据源名;sa:用户名;authodb:数据库名
Set Conn= Server.CreateObject("ADODB.Connection")
Conn.Open "DSN=carlos;UID=sa;PWD=;Database=authodb"
for I=0 to conn.errors.count-1
response.write conn.errors(I).description&"<br>"
next
'----创建临时存储过程----------
CommandText="CREATE PROCEDURE #query"&session("num")&_
" AS select * From authors Where "&str5
Conn.execute CommandText,0,-1
'-------创建RecordSet对象---------
Set rs=Server.CreateObject("ADODB.RecordSet")
'------运行临时存储过程-------------
Const adOpenDynamic=2
Const adLockOptimistic=3
const adComdStoredProc=8
CommandText="#query"&session("num")
session("num")=session("num")+1
rs.Open CommandText,Conn,adOpenDynamic,adLockOptimistic,_
adComdStoredProc
'----------显示查询结果 -----------------------------
response.write "<table border=""1"">"
response.write"<tr>"
for I=0 to rs.fields.count-1
response.write "<td>"&rs(I).Name&"</td>"
next
response.write "</tr>"
while not rs.EOF
response.write"<tr>"
for I=0 to rs.fields.count-1
css=rs(I).value
if css<>"" then
response.write "<td>"&css&"</td>"
else
response.write "<td>.</td>"
end if
next
rs.moveNext
response.write "</tr>"
Wend
response.write"</table>"
rs.close
set rs=nothing
set Conn=nothing
end if
%>
<!-- 查询结束,返回输入界面,开始下次查询 -->
<a href="input.htm">返回到查询</a>
</body>
</html>
由于返回后再次查询时,又一次运行query.asp,为避免每次执行query.asp时创建同名的存储过程,每次创建,临时存储过程名的序号加一,即依次为#query1(#query2,#query3,….)。由于我们创建的是临时存储过程,当用户查询结束退出时,这些存储过程会自动删除,不会对数据库造成任何影响。
四、后记
Query.asp,Global.asa文件必须放在有执行权限的虚拟路径下,Global.asa必须放在此路径的根目录下,而且同一个虚拟路径只能有一个Global.asa文件。
在实际应用中,我们往往要实现数据库的多表联合查询,以同时取得多个表的数据记录。对上述程序略加修改,可以很好地实现。
|