【问题标题】:Simple query with ADO and Classic ASP使用 ADO 和经典 ASP 进行简单查询
【发布时间】:2011-06-16 03:46:56
【问题描述】:

我想简单地从经典 ASP 页面中的数据库中检索一条记录。下面的代码基本上可以工作,但是我需要帮助解决几个问题:

1) 我想看看有没有返回记录。 result 不是 Nothing,因此永远不会执行底部的重定向。 contact.RecordCount 总是返回-1,所以我显然也不能使用它。奇怪的是,尝试在函数外部访问 RecordCount 会引发“对象不支持此属性或方法:'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 "))

【问题讨论】:

    标签: asp-classic ado


    【解决方案1】:

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

    如果您想使用 RecordCount 但得到 -1,则切换到客户端光标 (adUseClient)。

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

    3) 是的,参数化你的变量是完美的,除非你调用一个构造动态查询的存储过程。

    顺便说一句,您应该避免使用“SELECT *”,因为这会导致您返回的数据多于所需数据,并且是一个等待发生的维护问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多