å 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
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?
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.
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 ....
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
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
%>
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
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?
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
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.