doggelitoMedlem sedan juni 20003 100 inlägg
Hur tusan ska det se ut!
Jag blir inte klok på detta, var och hur ska man dimma objConn för att det ska blir rätt?
' Öppning av databas =========================================================
Public Function get_connection()
Dim objConn
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.open "Driver={SQL Server};Server=xxx;Database=xxx;UID=xxx;PWD=xxx"
Set get_connection = objConn
End Function
'Hämtar antal trådar =========================================================
Public Sub getCounterThreds(Byval Categoryid)
Dim rs, objConn
Set rs = get_recordset("Select Count(Questionid) From Questions " & _
"Where Categoryid = " & Categoryid & " ;")
If Not rs.Eof Then Response.Write rs(0)
call close_recordset(rs)
call close_Connection(objConn)
End Sub
' Stänger recordset ==========================================================
Public Sub close_recordset(rs)
rs.Close
Set rs = Nothing
End Sub
' Stängning av databas =======================================================
Public Sub close_connection(objConn)
objConn.Close() '***
Set objConn = Nothing
End Sub
Som det är nu så funkar allt utom stängning av databas, får fel:
Object required: 'objConn' ***
Tar jag däremot bort dimmningarna av objConn i function och subben och istället dimmar globalt på sidan så funkar det, men inte ska jag väl behöva det? :x
Erik JuhlinMedlem sedan maj 20007 625 inlägg
Stäng connection-objektet direkt efter du returnerat det i funktionen get_connection. Gör samma sak med get_recordset.
Och skippa då close subbarna.
doggelitoMedlem sedan juni 20003 100 inlägg
glömde visa get_recordset:
' Skapa ett recordset ========================================================
Public Function get_recordset(strSql)
Dim objConn
Set objConn = get_connection()
Set get_recordset = objConn.Execute(strSql)
End Function
Om jag stänger objConn redan i get_connection så får jag inte skapa recordsetet:
Operation is not allowed when the object is closed.
Jag kanske missförstod hur du menade?!
Erik JuhlinMedlem sedan maj 20007 625 inlägg
Så här tycker jag du ska skriva:
' Öppning av databas =========================================================
Public Function get_connection()
Dim objConn
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.CursorLocation = 3
objConn.CommandTimeout = 180
objConn.open "Driver={SQL Server};Server=xxx;Database=xxx;UID=xxx;PWD=xxx"
Set get_connection = objConn
Set objConn = Nothing
End Function
'Hämtar antal trådar =========================================================
Public Sub getCounterThreds(Byval Categoryid)
Dim rs
Set rs = get_recordset("Select Count(Questionid) From Questions " & _
"Where Categoryid = " & Categoryid & " ;")
If Not rs.Eof Then Response.Write rs(0)
Set rs = Nothing
End Sub
' Skapa ett recordset ========================================================
Public Function get_recordset(strSql)
Dim objConn
Set objConn = get_connection()
Set get_recordset = objConn.Execute(strSql)
Set objConn = Nothing
End Function
doggelitoMedlem sedan juni 20003 100 inlägg
Now we talking! :bire
Följdfråga: sätter du en timeout som kompensation för att inte objConn stängs?
Erik JuhlinMedlem sedan maj 20007 625 inlägg
Erik JuhlinMedlem sedan maj 20007 625 inlägg
Från MSDN:
The CommandTimeout property specifies the amount of time, in seconds, before the command is presumed to have failed.
Erik JuhlinMedlem sedan maj 20007 625 inlägg
Ännu bättre enligt mig.
' Öppning av databas =========================================================
Public Function get_connection()
Dim objConn
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.CursorLocation = 3
objConn.CommandTimeout = 180
objConn.open "Driver={SQL Server};Server=xxx;Database=xxx;UID=xxx;PWD=xxx"
Set get_connection = objConn
Set objConn = Nothing
End Function
'Hämtar antal trådar =========================================================
Public Sub getCounterThreds(Byval Categoryid)
Dim rs
Set rs = get_recordset("Select Count(Questionid) From Questions " & _
"Where Categoryid = " & Categoryid & " ;")
If Not rs.Eof Then Response.Write rs(0)
Set rs = Nothing
End Sub
' Skapa ett recordset ========================================================
Public Function get_recordset(strSql)
Dim objConn, rs
Set objConn = get_connection()
Set rs = Server.CreateObject("ADODB.Recordset")
rs.CursorLocation = 3
rs.Open strSql, objConn, 3, 1
rs.ActiveConnection = Nothing
Set get_recordset = rs
Set rs = Nothing
Set objConn = Nothing
End Function
' Hör en SQL ========================================================
Public Function execute_sql(strSql)
Dim objConn
Set objConn = get_connection()
If InStr(1, strSql, "UPDATE", 1) Or InStr(1, strSql, "DELETE", 1) Or InStr(1, strSql, "INSERT", 1) Then
objConn.Execute strSql, , 128
Else
Set execute_sql = objConn.Execute(strSql)
End If
Set objConn = Nothing
End Function
Då kan du få ett frånkopplat recordset med get_recordset. Mycket bättre prestandamässigt. :)
doggelitoMedlem sedan juni 20003 100 inlägg
Hey! coolt!
En sak till bara, tömmer man inte minnet när man skriver: Set objConn = Nothing?
Hur kan man i så fall skapa objektet objConn i Function get_connection()
och samtidigt stänga det i samma function?
Trots detta så kan man sedan skapa ett recordset med den öppningen! jag förstår inte riktigt flödet i detta.
Erik JuhlinMedlem sedan maj 20007 625 inlägg
Du öppnar först objektet. Sen returnerar man det. När man har returnerat det så är man klar med det och kan stänga det "lokala" objektet. Objektet har då redan blivit returnerat och finns då i funktionen get_recordset. :)
doggelitoMedlem sedan juni 20003 100 inlägg
Ahaa! Jag fattar, va kul, många tack!!! :bire