首页 文章

使用ADO和Classic ASP进行简单查询

提问于
浏览
3

我想简单地从经典ASP页面中的数据库中检索单个记录 . 下面的代码基本上有效,但我需要帮助解决一些问题:

1)我想查看是否返回了记录 . result 不是Nothing,因此从不执行底部的重定向 . contact.RecordCount 总是返回-1,所以我显然也不能使用它 . 奇怪的是,尝试在函数外部访问RecordCount会引发"Object doesn't support this property or method: 'RecordCount'"错误 .

2)我已经阅读了断开连接的查询,并看到了连接和命令关闭和/或在函数结束时设置为Nothing的示例 . 对于我应该做什么,是否有明确的最佳实践?

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

    1)要检查是否缺少记录,请使用rs.EOF,而不是“Is Nothing” . RecordSet对象始终是一个对象 . 只是有时它没有任何行 .

    如果要使用RecordCount但得到-1,则切换到客户端游标(adUseClient) .

    2)这里没有明确的最佳实践,但我个人总是关闭连接和命令,并没有太多的性能问题 . 连接对象特别珍贵,因此请在高容量页面上尽早关闭它们 .

    3)是的,除非您正在调用构造动态查询的存储过程,否则参数化变量是完美的 .

    顺便说一下,你应该避免使用“SELECT *”,因为这将导致你返回的数据超过了需要的数量,这是一个等待发生的维护问题 .

相关问题