使用ADO和经典ASP简单查询

使用ADO和经典ASP简单查询

问题描述:

我想简单地从经典ASP页面中的数据库中检索单个记录。下面的代码基本上工作,但有几个问题,我需要帮助解决:使用ADO和经典ASP简单查询

1)我想看看是否有记录返回或没有。 result不是Nothing,所以从不执行底部的重定向。 contact.RecordCount总是返回-1,所以我显然不能使用它。奇怪的是,试图在函数外部访问RecordCount会抛出一个“Object不支持此属性或方法:'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)要检查缺少记录,请使用rs.EOF,而不是“无”。 RecordSet对象始终是一个对象。只是有时它没有任何行。

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

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

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

顺便说一句,你应该避免“SELECT *”,因为这会导致你返回比需要更多的数据,并且是等待发生的维护问题。