JEMedlem sedan juni 2000144 inlägg Har gjort en class innehållandes en mängd funktioner. Eftersom flera av dessa funktioner ansluter till en databas gjorde jag en separat funktion för där databaskopplingen görs och öppnas samt en där den stängs. Fast det vill inte fungera. Vad gör jag för fel?
Class RecAdmin
Public Function OpenDB
Dim objConn
Set objConn = Server.CreateObject("ADODB.Connection")
strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& Server.MapPath("database/rec.mdb")
objConn.Open strConnectionString
End Function
Public Function CloseDB
objConn.Close
Set objConn = Nothing
End Function
Public Function GetInfo(intID)
strSQL = "SELECT ProdID, Quantity, Color, Size FROM RecNr WHERE ProdID="& intID
OpenDB
Set objRS = objConn.Execute(strSQL)
If objRS.Eof Then
Set objRS = Nothing
CloseDB
Else
'skriver ut resultatet
End If
End Function
End Class
Felmeddelandet jag får när jag anropar GetInfo blir då:
Error Type:
Microsoft VBScript runtime (0x800A01A8)
Object required: 'objConn'
functions.asp, line 80
Rad 80:
OpenDB
------------------
/JE
[Redigerat av JE den 16 maj 2001]
PatrikBMedlem sedan mars 20002 836 inlägg Du har dimmat objConn inne i functionen. Det innebär att den variabeln endast "lever" inne i den functionen
Själv gör jag på detta vis:
Class clsConn
Private m_objconn
Private m_strConnString
'## -- read/write properties starts here --
Public Property Let ConnectionString(ByVal sConnString)
m_strConnString = sConnString
End Property
Public Property Get ConnectionString
ConnectionString = m_strConnString
End Property
'## -- class methods starts here --
Public Sub Class_Initialize
'## -- create a db-connection object --
Set m_objConn = Server.CreateObject("ADODB.Connection")
End Sub
'## -- get a recordset --
Public Function GetInfo(intID) ' As Recordset
strSQL = "SELECT ProdID, Quantity, Color, Size FROM RecNr WHERE ProdID="& intID
Open
Set objRS = objConn.Execute(strSQL)
Set GetInfo = objRS
Set objRS = Nothing
Close
End Function
'## -- open connection --
Private Sub Open
m_objConn.Open ConnectionString
End Sub
'## -- close connection --
Private Sub Close
m_objConn.Close
End Sub
'## -- clean up --
Public Sub Class_Terminate
Set m_objConn = Nothing
End Sub
End Class
[r]
du skapar allt så här sedan:
Set objConnClass = New clsConn
objConnClass.ConnectionString = "din_connection_string"
Set objRS = objConn.GetInfo
If objRS.EOF Then
'visa ngt
Else
'skriv ut infon
End If
Set objRS = nothing
Set objConnClass = Nothing
[/r]
cya,
PatrikB
------------------
*Det tar sig sa han som hade eld i håret*
[Redigerat av PatrikB den 16 maj 2001]
JEMedlem sedan juni 2000144 inlägg Fick till fast jag gjorde bara så att jag la till "Public objConn" överst i klassen.
Class RecAdmin
Public objConn
Public Function OpenDB
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& Server.MapPath("database/rec.mdb")
End Function
Public Function CloseDB
objConn.Close
Set objConn = Nothing
End Function
Public Function GetInfo(intID)
strSQL = "SELECT ProdID, Quantity, Color, Size FROM RecNr WHERE ProdID="& intID
OpenDB
Set objRS = objConn.Execute(strSQL)
If objRS.Eof Then
Set objRS = Nothing
CloseDB
Else
'skriver ut resultatet
End If
End Function
End Class
Är det dumt att göra på detta sättet? Hängde inte med i din kod till 100%.
Aldrig använt klasser tidigare, håller på och lär mej så alla tips e välkommna =)
Hur som helst ska du ha stort tack för hjälpen PatrikB!
------------------
/JE
[Redigerat av JE den 16 maj 2001]
PatrikBMedlem sedan mars 20002 836 inlägg jo, visst kan man väl göra så som du gjort fast det blir ju lite mer dynamiskt med att ange ConnectionString i som en egenskap istället för att hårdkoda den =P
[r]
sedan så är din funktion GetInfo egentligen en sub och ingen funktion eftersom det inte "kommer" ut ett värde från den.
[/r]
Vad var det du inte hängde med på?
cya,
PatrikB
------------------
*Det tar sig sa han som hade eld i håret*
[Redigerat av PatrikB den 16 maj 2001]
JEMedlem sedan juni 2000144 inlägg ConnectionStringen vill jag faktiskt ha hårdkodad. Enklare att ändra på enbart ett ställe än på alla sidor som
använder klassen, lr?
Det jag inte riktigt hängde med på är denna del:
'## -- read/write properties starts here --
Public Property Let ConnectionString(ByVal sConnString)
m_strConnString = sConnString
End Property
Public Property Get ConnectionString
ConnectionString = m_strConnString
End Property
Antar att det har och göra med att du skickade med en ConnectionString. Fast vad koden gör har jag noll koll på hehe.
Ska exprimentera vidare =)
------------------
/JE
PatrikBMedlem sedan mars 20002 836 inlägg
ConnectionStringen vill jag faktiskt ha hårdkodad. Enklare att ändra på enbart ett ställe än på alla sidor som
använder klassen, lr?
Det är bara att i global.asa lägga in connectionstringen i en application variabel =P
Sub Applicatio_OnStart
Application("minConnString") = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=x:\db-dir\db-file.mdb"
End Sub
Nästa fråga:
Det med properties har du kanske använt dig av mot andra object, tex connection objectet:
....
objConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=x:\db-dir\db-file.mdb"
objConn.Open
....
dvs, du tilldelar/skriver ConnectionString variabeln ett värde.
I class exemplet ovan så betyder:
Property Let betyder att du kan tilldela egenskapen (skriva) ett visst värde. Property Get hämtar detta värde åt dig vid ett senare tillfälle när du behöver det.
Exempel:
'## -- tilldela egenskapen connectionstring ett värde --
objConnClass.ConnectionString = Application("minConnString")
När jag sedan behöver använda mig av connection strängen inne i min klass så behöver jag bara anropa den med:
ConnectionString
eller ute på asp sidan:
objConnClass.ConnectionString
tills nästa ggn,
cya all l8er
PatrikB
------------------
*Det tar sig sa han som hade eld i håret*
[Redigerat av PatrikB den 16 maj 2001]