2011-06-16 18 views
3

従来のASPページのデータベースから単一のレコードを取得するだけです。以下のコードは基本的に動作しますが、私は解決策が必要ないくつかの問題があります。ADOと従来の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 ")) 

答えて

6

1)レコードの不足をチェックするには、「何もありません」ではなくrs.EOFを使用します。 RecordSetオブジェクトは常にオブジェクトです。時には行がないこともあります。

RecordCountを使用したいのに-1が得られる場合は、クライアント側のカーソル(adUseClient)に切り替えます。

2)ここでは明確なベストプラクティスはありませんが、私は個人的には常にConnectionとCommandを閉じてしまっており、パフォーマンス上の問題がほとんどありませんでした。接続オブジェクトは特に貴重なので、大量のページで可能な限り早く閉じます。

3)はい、ダイナミッククエリを構築するストアドプロシージャを呼び出さない限り、変数のパラメータ化は完璧です。

ちなみに、「SELECT *」は、必要以上に多くのデータを返すため、発生するのを待っている保守上の問題です。

関連する問題