如何用ASP过滤从数据库中解析出来的数据 [英] How to filter data parsed from database using ASP
本文介绍了如何用ASP过滤从数据库中解析出来的数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我最近得到了一个相当混乱的ASP项目。我不熟悉这种语言,但在互联网上搜索了一段时间后,我终于学会了这种语言,但我仍然不熟悉数据库查询等。
问题来了,我的代码是从MS Access数据库文件中获取数据。我想要的是根据传递的POST/GET参数筛选此数据。以下是我到目前为止拥有的代码:
sql = "SELECT * FROM tyres"
if len(brand1) > 2 then
sql = sql & " WHERE brand = '" & brand1 & "' AND application = '" & season1 & "'"
if len(brand2) > 2 then
sql = sql & " or brand = '" & brand2 & "' AND application = '" & season2 & "'"
if len(brand3) > 2 then
sql = sql & " or brand = '" & brand3 & "' AND application = '" & season3 & "'"
if len(brand4) > 2 then
sql = sql & " or brand = '" & brand4 & "' AND application = '" & season4 & "'"
if len(brand5) > 2 then
sql = sql & " or brand = '" & brand5 & "' AND application = '" & season5 & "'"
set Dataconn = Server.CreateObject("ADODB.Connection")
Dataconn.Open "database-in"
set DataTable = Server.CreateObject("ADODB.recordset")
DataTable.Open sql, Dataconn
而且它似乎不起作用。注意,用户能够插入多达5个不同的参数(如您所见),以便在数据库中搜索产品。因此,如果您有任何关于如何使这项工作感觉自由建议的进一步信息。
推荐答案
如果这些字符串部分来自用户输入,则从字符串连接创建SQL是非常不明智的,甚至是直接创建dangerous。
数据库库(如ADODB)针对这种情况有commands和parameters。它们使用带有占位符的固定SQL字符串,并且库确保不会发生任何错误,无论用户提供的值是什么。
这也意味着我们可以预先准备一条SQL语句,并在页面的整个生命周期中多次重复使用它。
Dim Conn ' As ADODB.Connection
Dim Cmd ' As ADODB.Command
Set Conn = Server.CreateObject("ADODB.Connection")
Set Cmd = Server.CreateObject("ADODB.Command")
Conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:path oyourdatabase.accdb;"
' prepare a reusable command with parameters (i.e. placeholders)
With Cmd
Set .ActiveConnection = Conn
.CommandType = adCmdText
.CommandText = "SELECT Field1, Field2, Field3 WHERE brand = @brand AND application = @season"
' set up the parameters for each placeholder
' - use proper datatypes here, as per your DB
' - varchar types need a defined length
.Parameters.Append .CreateParameter("@brand", adVarChar, , 50)
.Parameters.Append .CreateParameter("@season", adVarChar, , 100)
End With
' helper function that operates the Command object and returns a RecordSet
Function SearchTyres(brand, season)
Cmd.Parameters("@brand", brand)
Cmd.Parameters("@season", season)
Set SearchTyres = Cmd.Execute
End With
能够在代码中使用adCmdText
或adVarChar
等特定于ADODB的常量是很方便的。要让它们在任何地方都可以轻松使用,您需要在global.asa
文件中声明ADODB类型库(如果没有,则创建一个),并将以下代码添加到文件的顶部:
<!--metadata
type="TypeLib"
name="Microsoft ActiveX Data Objects 6.1 Library"
uuid="B691E011-1797-432E-907A-4D8C69339129"
version="6.1"
-->
现在您可以在页面中使用它,例如:
If Len(brand1) > 2 Then
With SearchTyres(brand1, season1)
' ...let's do something with the RecordSet
While Not .EOF
Response.Write Server.HTMLEncode(!Field1) & "<br>"
.MoveNext
Wend
End With
End If
备注
- 请勿
SELECT *
-始终写出您想要的字段。 - 声明类型库并不是绝对必要的,但如果您不这样做,那么您必须自己定义所有的常量,就像
adVarChar
一样,这比它的价值要麻烦得多。
的简写With SearchTyres(...)
是Dim Rs Set Rs = SearchTyres(...) With Rs ' ... End With
Rs!Field1
是Rs.Fields("Field1")
的简写。在With Rs
块中,Rs
本身是可选的,因此纯!Field1
实际上是有意义的。- 最后,它可以帮助在MS Office产品(如Word)的VBA IDE中创建代码。使用工具/引用引用相同的ADODB类型库。VBA和VBS不是100代码兼容的,但VBA IDE具有智能感知,这是一个适当的调试器,使用相同的对象,并且只需最少的更改即可将代码传输到ASP。
这篇关于如何用ASP过滤从数据库中解析出来的数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文