webForumDet fria alternativet

dim & function & sub

ASP

10 svar · 315 visningar · startad av doggelito

Medlem sedan juni 20003 076 inlägg
Frågan#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

Medlem sedan maj 200010 687 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.

Medlem sedan juni 20003 076 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?!

Medlem sedan maj 200010 687 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
Medlem sedan juni 20003 076 inlägg
#5

Now we talking! :bire

Följdfråga: sätter du en timeout som kompensation för att inte objConn stängs?

Medlem sedan maj 200010 687 inlägg
#6

objConn stängs. :)

Medlem sedan maj 200010 687 inlägg
#7

Från MSDN:

The CommandTimeout property specifies the amount of time, in seconds, before the command is presumed to have failed.

Medlem sedan maj 200010 687 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. :)

Medlem sedan juni 20003 076 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.

Medlem sedan maj 200010 687 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. :)

Medlem sedan juni 20003 076 inlägg
#11

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

250 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
116 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
117 ms — ändringar (db)