Ad #6: benyt den korte form jeg refererede til, så skal du ikke tænke på CreateParameter og Parameters.Append :-)
Ad #7: Jeg vil tro du mangler at erklære (populært kaldt at Dim'e) Conn og Cmd-variablerne udenfor funktionen...
Jeg vil dog umiddelbart anbefale at du splitter de to handlinger op, således du har et sæt funktioner til at åbne og lukke forbindelsen til databasen og en der opretter et commandobjekt.
Eksempel:
function OpenConn()
Set Conn = Server.CreateObject("ADODB.Connection")
strDSN = application("dbconn")
Conn.Open strDSN
set OpenConn = conn
end function
function CloseConn(conn)
on error resume next
conn.close
end function
function GetCommand(conn, sql)
Set Cmd = Server.CreateObject("ADODB.Command")
set Cmd.ActiveConnection = Conn
cmd.commandtext = sql
cmd.commandtype = 1
set GetCommand = cmd
end function
Bemærk at du med dette setup så lokalt skal vedligeholde en connection-variabel, samt sende denne connectionvariabel med til GetCommand-funktionen.
Eksempel:
dim cn, cmd, rs, sql
sql = "SELECT felt1, felt2 FROM tabel1 WHERE id = ?"
set cn = OpenConn()
set cmd = GetCommand(cn, sql)
set rs = cmd.execute(, array(request.querystring("id")))
' do the looping-thing!
rs.close
set rs = nothing
call CloseConn(cn)
set cn = nothing
NB: Du behøver ikke være bekymret for at åbne og lukke forbindelsen mange gange, da der er connection pooling på IIS senere end version 5, såvidt jeg husker...
Vær desuden opmærksom på at hvis der sker en fejl, vil din forbindelse, med denne metode, ikke blive lukket igen, så du skal sørge for at håndtere fejl og få lukket din forbindelse hver gang.
Aternativt kan du pakke de tre funktionaliteter ind i en class. Det giver også mulighed for at håndtere lukning af en evt. åben forbindelse, hvis der skulle ske en fejl, mens den er åben.
Eksempel:
class Database
private conn
private strConn
private sub class_initialize()
strConn = ".. dine forbindelsesinformationer .."
set conn = nothing
end sub
private sub class_terminate()
call Close()
end sub
public sub Open()
call Close()
set conn = Server.CreateObject("ADODB.Connection")
conn.Open strConn
end sub
pubilc sub Close()
on error resume next
if not conn is nothing then
conn.close
end if
set conn = nothing
end sub
public function GetCommand(sql)
dim cmd
if conn is nothing then
call Open()
end if
set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = conn
cmd.CommandText = sql
cmd.CommandType = 1
set GetCommand = cmd
end function
end class
' Opret et globalt db-objekt, så det er let at referere til
dim db
set db = new Database
Denne klasse benyttes så således:
dim cmd, sql, rs
sql = "SELECT felt1, felt2 FROM tabel1 WHERE id = ?"
set cmd = db.GetCommand(sql)
set rs = cmd.execute(, array(request.querystring("id")))
' do the looping-thing!
rs.close
set rs = nothing
db.Close
Nu behøver du ikke tænke på om der sker fejl og siden lukker før forbindelsen, for når siden ophører med at eksistere, vil Database-klassens Class_Terminate-event blive kaldt... også selvom der er sket en fejl. Det er standard COM-opførsel :-)