如何用ASP过滤从数据库中解析出来的数据 [英] How to filter data parsed from database using ASP

查看:6
本文介绍了如何用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)针对这种情况有commandsparameters。它们使用带有占位符的固定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

能够在代码中使用adCmdTextadVarChar等特定于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!Field1Rs.Fields("Field1")的简写。在With Rs块中,Rs本身是可选的,因此纯!Field1实际上是有意义的。

  • 最后,它可以帮助在MS Office产品(如Word)的VBA IDE中创建代码。使用工具/引用引用相同的ADODB类型库。VBA和VBS不是100代码兼容的,但VBA IDE具有智能感知,这是一个适当的调试器,使用相同的对象,并且只需最少的更改即可将代码传输到ASP。

这篇关于如何用ASP过滤从数据库中解析出来的数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆