Простой запрос с ADO и Classic ASP - PullRequest
3 голосов
/ 16 июня 2011

Я хочу просто извлечь одну запись из базы данных на классической странице ASP.Приведенный ниже код в основном работает, но есть пара проблем, которые мне нужно решить:

1) Я хочу посмотреть, была ли возвращена запись или нет.result не является ничем, поэтому перенаправление внизу никогда не выполняется.contact.RecordCount всегда возвращает -1, поэтому я, очевидно, тоже не могу это использовать.Как ни странно, попытка получить доступ к RecordCount вне функции выдает ошибку «Объект не поддерживает это свойство или метод:« RecordCount »».

2) Я читал об отключенных запросах и видел примеры, где соединениеи команда закрывается и / или устанавливается в Ничто в конце функции.Есть ли определенная передовая практика в отношении того, что мне следует делать?

3) Будет ли использование параметризованного запроса полностью защищать меня от внедрения SQL или мне нужно вручную удалять опасные слова и символы?

function GetContactByUsername(username)
    Dim conn, command, param, contact
    set conn = server.CreateObject("adodb.connection")
    conn.Open Application("DatabaseConnectionString")

    Set command = Server.CreateObject("ADODB.COMMAND")
    set command.ActiveConnection = conn
    command.CommandType = adCmdText
    command.CommandText = "Select * from MY_DATABASE.dbo.Contact where Username = ?"

    Set param = command.CreateParameter ("Username", adVarWChar, adParamInput, 50)
    param.value = username
    command.Parameters.Append param 

    Set contact = Server.CreateObject("ADODB.RECORDSET")

    contact.Open command

    Response.Write contact.RecordCount   '' always -1

    set GetContactByPurlCode = contact
end function

dim result
result = GetContactByUsername(Request.QueryString("username"))

if result is Nothing then     '' never true
    Response.Redirect "/notfound.asp"
end if

FirstName = Trim(result("FirstName"))
LastName = Trim(result("LastName "))

1 Ответ

6 голосов
/ 16 июня 2011

1) Чтобы проверить отсутствие записей, используйте rs.EOF, а не «Ничто».Объект RecordSet всегда является объектом.Просто иногда в нем нет строк.

Если вы хотите использовать RecordCount, но получаете -1, переключитесь на курсор на стороне клиента (adUseClient).

2)Здесь нет никакой лучшей практики, но я лично всегда закрывал Соединение и Команду, и у меня не было особых проблем с производительностью.Объекты подключения особенно ценны, поэтому закрывайте их как можно раньше на страницах большого объема.

3) Да, параметризация вашей переменной идеальна, если только вы не вызываете хранимую процедуру, которая создает динамический запрос.

Кстати, вам следует избегать «SELECT *», так как это приведет к тому, что вы вернете больше данных, чем необходимо, и возникнет проблема с обслуживанием, ожидающая выполнения.

...