webForumDet fria alternativet

dim & function & sub

10 svar · 315 visningar · startad av doggelito

doggelitoMedlem sedan juni 20003 100 inlägg
#1

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
#2

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
#3

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
#4

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
#5

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
#6

objConn stängs. :)

Erik JuhlinMedlem sedan maj 20007 625 inlägg
#7

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
#8

Ä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
#9

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
#10

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
#11

Ahaa! Jag fattar, va kul, många tack!!! :bire

Genererad på 389 ms · cache AV · v20260730165559-full.f96bc7eb