Hittade nedanstående exempelkod på cmd-objektet och har några frågor om den. <b>frågetecknen är alltså placeholders för argumenten man skickar in?</b> >>Och en sista fråga - behöver man inte göra "set rs = nothing"? eller kanske inte "set conn = nothing" heller? Om det vore som så att ASP-motorn skötte sitt jobb. Jag har inte undersökt detta själv, men "förr" var det mycket tal om att objekten kunde ligga kvar i minnet ett bra tag om man inte satte varibeln = nothing. Hurvida detta stämmer eller inte låter jag vara osagt. Å andra sidan talas det längre ned i länken om folk som faktiskt löst diverse problem med att vara konsekventa med stänga och döda ado-objekt. Vilken betydels har: Och så är vi tillbka på det här med cmd, nu har man äntligen fått tummen ur! =)cmd frågor
Jag är med fram till rad 15, där undrar jag, frågetecknen är alltså placeholders för argumenten man skickar in? Matchas argumenten helt enketl i den ordning som frågetecknin dyker upp i cmd.CommandText?
Sedan på rad 21 undrar jag först varför det är ett komma utan någonting framför i cmd.Execute(), dessutom undrar jag varför det står array() runt argumenten som skall skickas in i SQLsträngen?
På rad 22-27 verkar det finnas en loop som inte gör någonting?? underförstått att jag där sätter in mitt eget syfte med recordsetet?
Och en sista fråga - behöver man inte göra "set rs = nothing"? eller kanske inte "set conn = nothing" heller? Har jag vant mig vid onödig kod? =)
1 Dim cmd
2 Dim conn
3 Dim SQLStmt
4 Dim rs
5 Dim employeeID
6 Dim employeeState
7
8 Set Conn = Server.CreateObject("ADODB.Connection")
9 Conn.Open CONNECTIONSTRING
10
11 Set cmd = server.createobject("ADODB.command")
12
13 cmd.activeConnection = conn
14
15 SQLStmt = "SELECT ID, Name, State FROM Employee WHERE (ID=? AND State=?)"
16 cmd.CommandText = SQLStmt
17
18 lngID = 5
19 StrState = "CA"
20
21 Set rs = cmd.Execute (, array(lngID, strState))
22 If not rs.eof then
23 Do until rs.eof
24
25 rs.movenext
26 next
27 End if
28
29 rs.close
30 conn.closeSv: cmd frågor
Ja
<b>Matchas argumenten helt enketl i den ordning som frågetecknin dyker upp i cmd.CommandText?</b>
Ja
<b>Sedan på rad 21 undrar jag först varför det är ett komma utan någonting framför i cmd.Execute()</b>
Har inte kollat upp, men antagligen är första argumentet frivilligt och parametrarnas värde är det andra argumentet.
<b>dessutom undrar jag varför det står array() runt argumenten som skall skickas in i SQLsträngen?</b>
Parametrarna ska antagligen skickas in som en array (funktionen skapar en array med argumentet).
<b>På rad 22-27 verkar det finnas en loop som inte gör någonting?? underförstått att jag där sätter in mitt eget syfte med recordsetet?</b>
Ja
<b>Och en sista fråga - behöver man inte göra "set rs = nothing"? eller kanske inte "set conn = nothing" heller? Har jag vant mig vid onödig kod? =) </b>
Nej, du ska göra det även i fortsättning. Exemplet är inte fulländat ;)
/JohanSv:cmd frågor
>>Har jag vant mig vid onödig kod? =)
>
>Nej, du ska göra det även i fortsättning. Exemplet är inte fulländat ;)
Det är onödigt att sätta variablerna till nothing om det är den sista koden på sidan/subrutin. Om varabeln strax går "out of scope" spelar det ingen roll om man precis innan satt den till nothing. Sv: cmd frågor
/JohanSv: cmd frågor
Sv:cmd frågor
rs.Close
Set rs = Nothing
con.Close
Set con = Nothing
Jämfört mot:
rs.Close
con.Close
Set rs = Nothing
Set con = Nothing
Bör ett recordset frigöras före connection, för att ett recordeset har en referens till connection, ADODB.Recordset.ActivConnection?
Borde man då inte skriva:
rs.Close
Set rs.ActiveConecction = Nothing
Set rs = Nothing
con.Close
Set con = Nothing
För att vara riktigt säker?
Inte glömma att stänga recordset man öppnar med ADODB.Connection.Execute().
Dim rs
Dim con
Set con = CreateObject("ADODB.Connection")
con. Open "Connection string"
'Set rs = CreateObject("ADODB.Recordset")
'Tidigare referns frigörs när rs tilldelas resultatet från execute.
'Execute skapar en egen instans av ett recordset och retunerar den.
Set rs = con.Execute("SELECT * FROM TableName")
rs.Close
Set rs = Nothing
con.Close
Set con = Nothing
Frågan är när man gör en loop genom ett recordset i en loop genom ett recordset:
Dim rs1
Dim rs2
Dim con
Set con = CreateObject("ADODB.Connection")
con. Open "Connection string"
Set rs1 = CreateObject("ADODB.Recordset")
Set rs2 = CreateObject("ADODB.Recordset")
rs1.Open "SELECT * FROM TableName1", con
Do until rs1.EOF
rs2.Open "SELECT * FROM TableName2 WHERE X = " rs1("id"), con
rs2.Close
rs1.MoveNext
Loop
Set rs2 = Nothing
rs1.Close
Set rs1 = Nothing
con.Close
Set con = Nothing
Vad tjänar man på att återanvända recordsetet i loopen? Bör man göra det?
Sedan har vi de som överst på sin sida instansierar en anslutning och öppnar den för att sist på sidan stänga den. Ibland med hjälp av includ-filer.
Så sätt objekten till nothing. Gör det i rätt ordning.
Du kan låta bli, klara dig undan med några rader minder kod och en likaväl fungerade applikation eller inte.
Viktigaste är att vara medveten om problematiken och förstå varför den ibland behövs.
Sv: cmd frågor
jag har alltid kört
Set Rs = Server.CreateObject("ADODB.Recordset")
och sedan kört
rs.open "bla bla"
men i exemplet ovan är det alltså
Set rs = cmd.Execute (, array(lngID, strState))
innebär det att min rad med set rs... adodb recordset utgår och objektet både skapas och fylls med rätt data i en och samma rad? Tar cdm alltså hand om den biten själv att göra rs till ett recordset?
sedan undrar jag en sak till, när jag kör insert eller update-frågor och inte select frågor, skall jag bara utelämna "set rs" biten då och bara köra
cmd.Execute (, array(lngID, strState))
förutsatt att jag laddat cmd.CommandText med rätt uppdaterings/insert fråga?