webForumDet fria alternativet

Public Class_Initialize() i ASP-klass

ASP

23 svar · 459 visningar · startad av OveRRidE

Medlem sedan feb. 200112 078 inlägg
Frågan#1

Finns det någon nackdel/felaktighet i att ha metoden Class_Initialize() som en publik metod och inte som privat, i en ASP-klass?

[b]Public[/b] Sub Class_Initialize()
   Set objDb = New DataHandler
End Sub

Jag får inte använda objDb i de publika metoderna annars.

Medlem sedan dec. 20003 887 inlägg
#2

Kan du inte definiera objDb som en public member i klassen då?

Medlem sedan feb. 200112 078 inlägg
#3

Hur menar du då?

Medlem sedan dec. 20003 887 inlägg
#4
Class cTjosan
  Public objDb

  Private Sub Class_Initialize
    Set objDb = New DataHandler
  End Sub
End Class

Nånting sånt...

Medlem sedan mars 20002 836 inlägg
#5

om den, objDB, endast ska användas internt borde den deklareras Private istället för Public ......

cya,
PatrikB

Medlem sedan maj 2000175 inlägg
#6

Den enda nakdelen är väl att du, som användare av objektet, kan köra Class_Initialize() efter det att objektet har initieras...

Medlem sedan dec. 20003 887 inlägg
#7

Jag antar att den inte bara ska användas internt. Annars så förstår jag faktiskt inte problemet riktigt...

Mer beskrivning av problemet, tack :)

Medlem sedan mars 20002 836 inlägg
#8

å andra sidan, varför ha den i Class_Initialize() ....

Om du har flera klasser som arbetar på samma sida kommer det således att bli många olika öppningar mot db.

Ett bättre sätt är att skapa DataHandlern utanför klassen som ska använda den och sedan i klassen som ska använda den:

Class MyClass

	Private m_dbhandler

	Public Sub SetDBHandler(ByRef oDbHandler)
		Set m_dbhandler = oDbHandler
	End Sub

	Private Sub Class_Initialize()
		Set m_dbhandler = Nothing
	End Sub

	Private Sub Class_Terminate()
		Set m_dbhandler = Nothing
	End Sub
End Class

cya,
PatrikB

Medlem sedan feb. 200112 078 inlägg
#9

Ok, men kanske är det tänket som är fel då. :)

Jag har lagt metoder för att t.ex. öppna conn och exekvera sql-statements i klassen datahandler. Därför vill jag göra en instans av den klassen för att sedan använda i den första. Skall man göra det enklare för sig och ha dem som metoder i den första klassen och skippa datahandler helt och hållet?

Medlem sedan feb. 200112 078 inlägg
#10

Ok, nu har jag det såhär:

En metod (getAll) i class1 anropas och i class_initialize instansieras class2 i objDb. I getAll används metoden exec_sql från objDb. I class_initialize i class2 körs openConn som lägger en ADODBConn i objConn, som sedan används i metoden exec_sql. I class_terminate i class2 förstörs sedan objConn och i class_terminate i class1 förstörs objDb.

Rätt eller helt fel? Kod kanske? ;)

Medlem sedan mars 20002 836 inlägg
#11

Nä, tänket med en DataHandler tycker jag e helt riktigt.

Det jag INTE tycker är riktigt bra är att initiera en ny instans av DAtaHandlern inne i varje klass.

kika lite på ADODB.Recordset ..... där kan man skapa objektet inne klassen, rst.Open sql, "Provider=Microsoft.Jet.OLEDB....", eller använda conn-objekt skapat utanför klassen, rst.Open sql, myConnObject

På samma sätt kan du skapa dina klasser..

litet exempel:


Dim objHandler	' As DataHandler
Dim objMyClass	' As MyClass
Dim objOther	' as OtherClass
Dim rstList	' As Recordset

Set objHandler = New DataHandler

	objHandler.ConnectionString = "MyConnString"

	Call objHandler.OpenConnection()

	Set objMyClass = New MyClass

		Call objMyClass.SetDBHandler(objHandler)

		Set rstList = objMyClass.GetList()

		Set rstList = Nothing

	Set objMyClass = Nothing

	Set objOther = New Other

		Call objOther.SetDBHandler(objHandler)

	Set objOther = Nothing

	Call objHandler.CloseConnection()

Set objHandler = Nothing

Class MyClass

	Private m_dbhandler	' As DataHander

	Public Sub SetDBHandler(ByRef oDbHandler)
		Set m_dbhandler = oDbHandler
	End Sub

	Public Function GetList() ' As Recordset
		Dim queryList	' As String

		queryList = "SELECT * FROM MyTable"

		Set GetList = GetHandler().GetRecordset(queryList)
	End Function

	Private Sub Class_Initialize()
		Set m_dbhandler = Nothing
	End Sub

	Private Function GetHandler()
		Set GetHandler = m_dbhandler
	End Function

	Private Sub Class_Termiante()
		Set m_dbhandler = Nothing
	End Sub
End Class

På detta sätt används endast en connection istället.
Om jag initierat DataHandler inne i klassen hade jag haft lika många connections skapade som jag initierat klasser ....

cya,
PatrikB

Medlem sedan feb. 200112 078 inlägg
#12
Class class1
public objDb

Public function getAll()
  använder execute_sql
End function

Public Sub Class_Initialize()
   Set objDb = New qBizDataHandler
End Sub

Private Sub Class_Terminate()
   Set objDb = Nothing
End Sub

End class
Class DataHandler

Public Function execute_sql(strSql)
   If InStr(1, strSql, "UPDATE", 1) Or InStr(1, strSql, "DELETE", 1) Or InStr(1, strSql, "INSERT", 1) Then
     objConn.Execute strSql, , 128
     execute_sql = True
   Else
     Set execute_sql = objConn.Execute(strSql)
   End If
End Function
	
Public Sub openConn()
   Dim dbPath
   dbPath = server.mappath("/data/data.mdb")

   set objC = server.createobject("ADODB.Connection")
   objC.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbPath
   set objConn = objC
   set objC = nothing
End Sub
	
Private Sub Class_Initialize()
   openConn
End Sub
	
Private Sub Class_Terminate()
   set objConn = nothing
End Sub

End class
Medlem sedan feb. 200112 078 inlägg
#13

En fråga; varför har du mellansteget

Private Function GetHandler()
   Set GetHandler = m_dbhandler
End Function

Varför inte bara göra såhär:

Set GetList = m_dbhandler.GetRecordset(queryList)
Medlem sedan feb. 200112 078 inlägg
#14

Ok. Såhär då: Verkar det optimalt? ;)

Jag har inte jobbat på det viset med klasser innan.

<%
Class clsShop
	Private m_dbhandler	' As DataHander

	Public Sub SetDBHandler(ByRef oDbHandler)
		Set m_dbhandler = oDbHandler
	End Sub

	Public Function getAll() ' As Recordset
		SQL = "SELECT * FROM [table]"
		Set getAll = GetHandler().Execute_sql(SQL)
	End Function

	Private Sub Class_Initialize()
		Set m_dbhandler = Nothing
	End Sub

	Private Function GetHandler()
		Set GetHandler = m_dbhandler
	End Function

	Private Sub Class_Terminate()
		Set m_dbhandler = Nothing
	End Sub
End Class

Class dataHandler
	private objConn 
	
	Public Function execute_sql(strSql)
		If InStr(1, strSql, "UPDATE", 1) Or InStr(1, strSql, "DELETE", 1) Or InStr(1, strSql, "INSERT", 1) Then
			objConn.Execute strSql, , 128
			execute_sql = True
		Else
			Set execute_sql = objConn.Execute(strSql)
		End If
	End Function
	
	Public Sub openConn()
		Dim dbPath
		dbPath = server.mappath("/data/data.mdb")
		
		set objC = server.createobject("ADODB.Connection")
		objC.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbPath
			set objConn = objC
		set objC = nothing	
	End Sub
	

	Public Sub OpenConnection()
		openConn
	End Sub
	
	Public Sub CloseConnection()
		objConn.close
		set objConn = nothing
	End Sub		
End Class
%>
Medlem sedan mars 20002 836 inlägg
#15

OveRRidE skrev:

En fråga; varför har du mellansteget

Private Function GetHandler()
   Set GetHandler = m_dbhandler
End Function

Varför inte bara göra såhär:

Set GetList = m_dbhandler.GetRecordset(queryList)

För att i ett senare skede så kanske jag vill lägga till olika typer av checkar, som är connection öppen?, är connection-stängd?, finns det ett object av DataHandlern skapad (SetHandler...) m.m, m.m

Denna check kan man göra i denna funktion: GetHandler()
Skulle jag bara använda m_dbhandler så blir det att ändra på många olika ställen ...... eller koda det på många olika ställen

cya,
PatrikB

Medlem sedan juni 20022 599 inlägg
#16

1. Som koden ser ut nu finns det ingen anledning för objConn att vara Public.
2. Class_Initialize i clsShop gör inget meningsfullt.
3. objC i openConn är onödig.
4. Om openConn ändå är Public varför är den då wrappad en gång till i OpenConnection?

Medlem sedan feb. 200112 078 inlägg
#17

För att i ett senare skede så kanske jag vill lägga till olika typer av checkar, som är connection öppen?,

Point.

Niko;

1. Jag upptäckte objConn där, den är private nu.
2. Sant, den såg jag inte ens.
3. Hrm?
4. -

Medlem sedan mars 20002 836 inlägg
#18

Rent generellt skulle nog min Wrapper (datahandler) klass se ut mer åt detta hållet:

Class dataHandler
	private m_cnn	' As ADODB.Connection
	
	Public Function execute_sql(strSql) ' As Integer
		Dim rows	' As Integer
		
		GetConnection().Execute(strSql,rows,128)
		execute_sql = rows
	End Function
	
	Public Function GetRecordset(strSql) ' As Recordset
		Set GetRecordset = GetConnection().Execute(strSql)
	End Function

	Public Sub openConn()
		Dim dbPath
		dbPath = server.mappath("/data/data.mdb")
		
		GetConnection().Open dbPath	
	End Sub
	
	Public Sub CloseConnection()
		m_cnn.close
	End Sub

	Private Sub Class_Initialize()
		Set m_cnn = Server.CreateObject("ADODB.Connection")
	End Sub

	Private Function GetConnection()
		Set GetConnection = m_cnn
	End Function

	Private Sub Class_Initialize()
		Set m_cnn
	End Sub
End Class

att i funktionen kika om INSERT, DELETE eller update finns med och utifrån det anta att det är frågan om att inte returnera ett recordset låter lite farligt.
kanske är det så att man vill ha ett recordset tillbaka i följande:

strSQL = "SELECT * FROM MyTable WHERE MyField LIKE '%INSERT%'"

vad händer då??? jo, den exekverar select frågan men kommer inte att returnera ngt recordset ... hmm, lite snopet ;O

cya,
PatrikB

Medlem sedan feb. 200112 078 inlägg
#19

att i funktionen kika om INSERT, DELETE eller update finns med och utifrån det anta att det är frågan om att inte returnera ett recordset låter lite farligt.

Ok. En left(str,6) på strängen mot SELECT, INSERT, DELETE eller UPDATE, så har vi löst det.

Medlem sedan mars 20002 836 inlägg
#20

he, he ... jepp :e

cya,
PatrikB

257 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
116 ms — ändringar (db)