John W. Colby
jwcolby at colbyconsulting.com
Sun Jul 24 20:16:57 CDT 2005
Doris,
I decided to make my SysVar data object a structure rather than a class. I
haven't really decided whether that was a good idea or not, but the
structure for a SysVar just holds 6 pieces of data:
The PKID from the table - Long
The SysVar name - String
The SysVar value - Object
The SysVar memo - String
And a pair of boolean flags - UserEditable and AllowOverride
I have run into a handful of places in the past where I built a system where
I would load a table, each record represented by a data class, and a
collection class that holds a data class instance for every record in the
table. SysVars is one of these places.
So it seemed that a structure was a good idea for the data class. However I
still wanted a single method in the data class that I called to initialize
every variable in the data class, passing in (in this case) all 6 pieces of
data from a record to the data class. Thus the data class init code looked
something like:
Public Sub Init(ByVal lintID As Int32, ByVal lstrName As String, ByVal
lobjValue As Object, ByVal lstrMemo As String, _
ByVal lblnUserEditable As Boolean, ByVal lblnAllowOverride As Boolean)
mintID = lintID
mstrName = lstrName.ToLower
mobjValue = lobjValue
mstrMemo = lstrMemo.ToLower
mblnUserEditable = lblnUserEditable
mblnAllowOverride = lblnAllowOverride
End Sub
With the collection class method that creates these things looked something
like:
mOleDBReader = mOleDBCmd.ExecuteReader
With mOleDBReader
While .Read
NewSysVar(mOleDBReader("SV_ID"), mOleDBReader("SV_VarName"),
mOleDBReader("SV_VarValue"), mOleDBReader("SV_Memo"),
mOleDBReader("SV_UserEditable"), mOleDBReader("SV_AllowOverride"))
End While
End With
Public Sub NewSysVar(ByVal lintID As Int32, ByVal lstrName As String,
ByVal lobjValue As Object, ByVal lstrMemo As String, _
ByVal lblnUserEditable As Boolean, ByVal lblnAllowOverride As
Boolean)
Dim lSysVar As stcSysVar
lSysVar.Init(lintID, lstrName, lobjValue, lstrMemo,
lblnUserEditable, lblnAllowOverride)
Add(lSysVar)
End Sub
The line:
lSysVar.Init(lintID, lstrName, lobjValue, lstrMemo,
lblnUserEditable, lblnAllowOverride)
Gives me this error I am discussing - "lSysVar is used before it is assigned
a value."
This is one reason I am not sure that the Structure is necessarily better
than a class at least in this case. If I had a class I would just have a
New() constructor that I fed the data values into. A structure doesn't have
a New (or a constructor), and it "expects" that each data item of the
structure would be accessed individually, set, and then read. Because I
call a method with all values at once, I never "set" a property first and I
get this annoying error that never goes away.
Sigh.
Yea, I could set a property just to cause the error message to go away but I
don't want to. I could also have gotten rid of NewSysVar and just done each
property individually, but I don't want to.
John W. Colby
www.ColbyConsulting.com
Contribute your unused CPU cycles to a good cause:
http://folding.stanford.edu/
-----Original Message-----
From: dba-vb-bounces at databaseadvisors.com
[mailto:dba-vb-bounces at databaseadvisors.com] On Behalf Of Mike & Doris
Manning
Sent: Sunday, July 24, 2005 2:29 PM
To: ebarro at afsweb.com; dba-vb at databaseadvisors.com
Subject: RE: [dba-VB] .net piddly warnings
In VB.Net, you can combine the declaration and the initialization on one
line as follows:
Dim str as String = vbNullString
Dim bol as Boolean = False
Dim int as Integer = 0
Doris Manning
Database Administrator
Hargrove Inc.