---
title: "Public Class_Initialize() i ASP-klass"
type: "forum-thread"
url: "https://www.webforum.nu/amne/asp/72214-public-class-initialize-i-asp-klass"
topic: "ASP"
topic_url: "https://www.webforum.nu/amne/asp"
author: "OveRRidE"
published: "2003-03-26T13:23:36.000Z"
updated: "2003-03-27T08:16:39.000Z"
replies: 23
views: 500
page: 1
pages: 2
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/asp/72214-public-class-initialize-i-asp-klass"
---

# Public Class_Initialize() i ASP-klass

_Sida 1 av 2._

## #1 — OveRRidE, 2003-03-26T13:23Z

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.

Permalänk: https://www.webforum.nu/p/72214

## #2 — Engine^, 2003-03-26T13:43Z

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

Permalänk: https://www.webforum.nu/p/991196

## #3 — OveRRidE, 2003-03-26T13:50Z

Hur menar du då?

Permalänk: https://www.webforum.nu/p/991203

## #4 — Engine^, 2003-03-26T13:58Z

```
Class cTjosan
  Public objDb

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

Nånting sånt...

Permalänk: https://www.webforum.nu/p/991212

## #5 — PatrikB, 2003-03-26T14:06Z

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

cya,
PatrikB

Permalänk: https://www.webforum.nu/p/991219

## #6 — rymdknark, 2003-03-26T14:07Z

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

Permalänk: https://www.webforum.nu/p/991222

## #7 — Engine^, 2003-03-26T14:08Z

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 :)

Permalänk: https://www.webforum.nu/p/991223

## #8 — PatrikB, 2003-03-26T14:11Z

å 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

Permalänk: https://www.webforum.nu/p/991225

## #9 — OveRRidE, 2003-03-26T14:30Z

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?

Permalänk: https://www.webforum.nu/p/991245

## #10 — OveRRidE, 2003-03-26T14:40Z

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? ;)

Permalänk: https://www.webforum.nu/p/991260

## #11 — PatrikB, 2003-03-26T14:44Z

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

Permalänk: https://www.webforum.nu/p/991262

## #12 — OveRRidE, 2003-03-26T14:45Z

```
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
```

Permalänk: https://www.webforum.nu/p/991263

## #13 — OveRRidE, 2003-03-26T15:06Z

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)
```

Permalänk: https://www.webforum.nu/p/991282

## #14 — OveRRidE, 2003-03-26T15:52Z

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
%>
```

Permalänk: https://www.webforum.nu/p/991319

## #15 — PatrikB, 2003-03-26T16:00Z

> **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

Permalänk: https://www.webforum.nu/p/991327

## #16 — niko, 2003-03-26T16:05Z

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?

Permalänk: https://www.webforum.nu/p/991332

## #17 — OveRRidE, 2003-03-26T16:09Z

> 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\. -

Permalänk: https://www.webforum.nu/p/991335

## #18 — PatrikB, 2003-03-26T16:10Z

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

Permalänk: https://www.webforum.nu/p/991336

## #19 — OveRRidE, 2003-03-26T16:18Z

> 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.

Permalänk: https://www.webforum.nu/p/991343

## #20 — PatrikB, 2003-03-26T16:27Z

he, he ... jepp :e

cya,
PatrikB

Permalänk: https://www.webforum.nu/p/991353

---

Tråden på webben: https://www.webforum.nu/amne/asp/72214-public-class-initialize-i-asp-klass  
Nästa sida: https://www.webforum.nu/amne/asp/72214-public-class-initialize-i-asp-klass/page2.md
