Весьма неразумно создавать SQL из конкатенации строк, и даже правый опасен , если эти строки частично получены из пользовательского ввода.
Библиотеки баз данных, такие как ADODB, имеют команды и параметры для этой ситуации. Они используют фиксированную строку 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\to\your\database.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
Удобно иметь возможность использовать в своем коде специфичные для ADODB константы, такие как adCmdText
или adVarChar
. Чтобы они были доступны в любом месте без суеты, вам нужно объявить библиотеку типов ADODB в файле global.asa
(создайте ее, если у вас ее нет), добавив ее в начало файла:
<!--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
действительно имеет смысл.
- Наконец, это может помочь в создании кода в VBA IDE MS Office. продукт (такой как Word). Используйте Инструменты / Ссылки для ссылки на ту же библиотеку типов ADODB. VBA и VBS не совместимы на 100 кодов, но IDE VBA имеет Intellisense, правильный отладчик, использует те же объекты, и код может быть перенесен в ASP с минимальными изменениями.