New to Classes, please help.

D

David Lozzi

Howdy,

I'm new to classes. Below is my class User. (is this a reserved namespace or
class?) It works great, kind of. If I specify the username and password, the
correct firstname and lastname are returned. For example, username dlozzi,
password fun. It returns David Lozzi as full name. If I login as someone
else on another computer, say username dsmith and password fun2, the second
computer displays the correct fullname. HOWEVER if I refresh the page on the
first computer where I logged in under dlozzi, the information is now
dsmith's info. I believe I am just missing one small piece, but I just
cannot find it. Should I be using Session states along with classes?

Thanks!

David Lozzi



Imports System.Configuration
Imports System.Data.SqlClient


Public Class User
Private Shared sqlConn As String =
ConfigurationSettings.AppSettings("ConnectionString")
Private Shared _firstname As String
Private Shared _lastname As String
Private Shared _username As String
Private Shared _password As String


Public Shared Function Login() As Boolean

_username = Replace(_username, "'", "''")
_password = Replace(_password, "'", "''")

Dim sqlQry As String = "cp_GetUser '" & _username & "'"

Dim myConnection As New SqlConnection(sqlConn)
myConnection.Open()
Dim myCommand As New SqlCommand(sqlQry, myConnection)

Dim rec As SqlDataReader
rec = myCommand.ExecuteReader()

If Not rec.Read Then
Login = False
Else
If _password = rec("strPassword") Then
_firstname = rec("strFirstName")
_lastname = rec("strLastName")
_password = "none"
Login = True
End If
End If
End Function

Public Shared Property FirstName() As String
Get
Return _firstname
End Get
Set(ByVal Value As String)
_firstname = Value
End Set
End Property

Public Shared Property LastName() As String
Get
Return _lastname
End Get
Set(ByVal Value As String)
_lastname = Value
End Set
End Property

Public Shared ReadOnly Property FullName() As String
Get
Return _firstname & " " & _lastname
End Get
End Property

Public Shared ReadOnly Property FullNameRev() As String
Get
Return _lastname & ", " & _firstname
End Get
End Property


Public Shared Property UserName() As String
Get
Return _username
End Get
Set(ByVal Value As String)
_username = Value
End Set
End Property

Public Shared Property Password() As String
Get
Return _password
End Get
Set(ByVal Value As String)
_password = Value
End Set
End Property
End Class
 
P

Peter MacMillan

David said:
Howdy,

I'm new to classes. Below is my class User. (is this a reserved namespace or
class?) It works great, kind of. If I specify the username and password, the
correct firstname and lastname are returned. For example, username dlozzi,
password fun. It returns David Lozzi as full name. If I login as someone
else on another computer, say username dsmith and password fun2, the second
computer displays the correct fullname. HOWEVER if I refresh the page on the
first computer where I logged in under dlozzi, the information is now
dsmith's info. I believe I am just missing one small piece, but I just
cannot find it. Should I be using Session states along with classes?

Thanks!


Your problem is coming from all of your methods and properties being
shared. I'm not sure how to explain this without going all-out on OO
methodology... "shared" means there is only one of that thing for the class.

You're right to have the login method (method is an OO word for
procedure/function).

You want something like:

Public Class User
Private m_username As String

Public Sub New()
End Sub

Public Property Username() As String
Get
Return m_username
End Get
Set(ByVal value As String)
m_username = value
End Set
End Property

Public Shared Function Login(ByVal username As String) As User

Dim result As User
result = new User()
result.Username = username
return result

End Function
End Class


(I don't guarantee that the above will work because I just typed it out
in my newsreader. It should show you what needs to be done).

Now from whereever you're loging them in, you call the Login function to
get a User object. You can then store that User into the Session (say,
put it in Session("UserObject") or something like that.

--
Peter MacMillan
e-mail/msn: (e-mail address removed)
icq: 1-874-927

GCS/IT/L d-(-)>-pu s():(-) a- C+++(++++)>$ UL>$ P++ L+ E-(-) W++(+++)>$
N o w++>$ O !M- V PS PE Y+ t++ 5 X R* tv- b++(+) DI D+(++)>$ G e++ h r--
y(--)
 
K

Kevin Spencer

As David is "new to classes," I thought I'd follow up your excellent advice
with a bit of more detailed information about classes.

A class is a data type, just as an integer or a string. A data type
specifies both the type of data stored in an instance of that type, as well
as the amount of memory necessary to allocate to store that type of data. An
Integer, for example, is a 32-bit storage space that contains an integer
value (remember that underneath it all it's just 1s and 0s). A string is a
pointer to an array of characters. Note that an array is also a data type,
as well as a pointer. A pointer is the address in memory of the object being
pointed to. It is the size of a memory address.

Structures were clreated before classes. A structure is an aggregate data
type (like an array), which can contain multiple data types in a single
storage space. A simple structure, for example, could contain an integer and
a string. The size of the structure would be 32-bits plus the size of the
pointer to the string. A structure can also have process. That is, you can
make a function a member of a structure. So, you can see by now that a
structure is a primitve class of sorts.

With the advnet of OOP, classes were created. Classes are basically
structures, but have additional properties, such as Inheritance,
Encapsulation, Polymorphism and Abstraction. For example, a class can have
private or public members (plus several others). Private class members
cannnot be accessed outside the class. Inheritance gives you the ability to
EXTEND a class with an inherited class. By using Inheritance, all the
characteristics of the base class are automatically attributed to the
inherited class, which can extend the base class with additional properties
or functionality.

As to Shared classes and members: A program has 2 basic memory areas: The
stack and the heap. The heap is where all the code for the program is loaded
when the program starts. In a sense, it is an in-memory copy of the program,
and all of its process and data. It is a single "instance" if you will, of
all the code. As the program runs, functions are called. Ordinarily, a copy
("instance") of the function is placed on top of the stack, where it remains
until the function returns. However, a static method or piece of data is not
instantiated. A copy is not placed on the stack every time the method is
called. Instead, the single "copy" in the heap is used. that single copy is
used by all aspects of the program. As there is only one (hence
"singleton"), it is not thread-safe. In a sense, it is "shared" by all
functions that call it.

--
HTH,

Kevin Spencer
Microsoft MVP
..Net Developer
What You Seek Is What You Get.
 
D

David Lozzi

Hmm.. OK.

I'm following you for the most part in your sample, but once it is in the
Session var, how do I reference it again somewhere else?

Thanks,

David Lozzi
 
D

David Lozzi

OK, so i think i got it. My code is below. It appears to work great, the
user object is saved in the user's session state. Check out the code for
home.aspx. Will I have to thos first 2 lines every time? Can a class pull
data from a session automatically, so all i would have to do is Imports
app.User and then in my script just call the FullName property? Know what I
mean?


*****
in User.vb
Imports System.Configuration
Imports System.Data.SqlClient


Public Class User
Private sqlConn As String =
ConfigurationSettings.AppSettings("ConnectionString")
Private _firstname As String
Private _lastname As String
Private _username As String
Private _password As String


Public Function Login() As Boolean

_username = Replace(_username, "'", "''")
_password = Replace(_password, "'", "''")

Dim sqlQry As String = "cp_GetUser '" & _username & "'"

Dim myConnection As New SqlConnection(sqlConn)
myConnection.Open()
Dim myCommand As New SqlCommand(sqlQry, myConnection)

Dim rec As SqlDataReader
rec = myCommand.ExecuteReader()

If Not rec.Read Then
Login = False
Else
If _password = rec("strPassword") Then
_firstname = rec("strFirstName")
_lastname = rec("strLastName")
_password = "none"
Login = True
End If
End If
End Function

Public Property FirstName() As String
Get
Return _firstname
End Get
Set(ByVal Value As String)
_firstname = Value
End Set
End Property

Public Sub New()

End Sub

Public Property LastName() As String
Get
Return _lastname
End Get
Set(ByVal Value As String)
_lastname = Value
End Set
End Property

Public ReadOnly Property FullName() As String
Get
Return _firstname & " " & _lastname
End Get
End Property

Public ReadOnly Property FullNameRev() As String
Get
Return _lastname & ", " & _firstname
End Get
End Property


Public Property UserName() As String
Get
Return _username
End Get
Set(ByVal Value As String)
_username = Value
End Set
End Property

Public Property Password() As String
Get
Return _password
End Get
Set(ByVal Value As String)
_password = Value
End Set
End Property
End Class

*****
in default.aspx
Dim usr As New User
usr.UserName = txtusername.Text
usr.Password = txtpassword.Text

If Not usr.Login() Then
lblStatus.Text = "Unsuccessful. Please try again.<br>" &
usr.UserName
Else
Session("UserObj") = usr
Response.Redirect("home.aspx")
End If

*****
in home.aspx
1 Dim usr As User
2 usr = Session("UserObj")
3 lblStatus.Text = "Welcome " & usr.FullName & "<br>Fullnamerev " &
usr.FullNameRev



Thanks!!
 
K

Kevin Spencer

If I were you, I'd close my Connection before I'd look at anything else.
Next, I'd turn Option Strict ON. Then I'd fix all of the exceptions that
turning Option Strict ON will raise.

And remember that classes are not magic, or anything strange to you. They
are simply containers for process and data. So, for example, when you ask -
Can a class pull data from a session automatically, so all i would have to
do is Imports app.User and then in my script just call the FullName
property? Know what I mean?

Keep in mind that a class is just code, encapsulated in a class definition.
It can do anything that any other code can do.

Keep studying. "Imports" is a pre-processor declaration that is useful for
the developer, to prevent the developer from having to type the full
namespace every time something in that namespace is used. At run-time, it
does nothing.

One last piece of advice: When somebody gives you code, do yourself a favor
and don't use it until you understand it fully. Why? Well, for one thing,
the next time you need similar code you can write it yourself. It enhances
your skillset. And you wouldn't eat something that some stranger on the
street gave you, would you? It might be bad. So, it's not a good idea for
your program to eat code that somebody gave you off the street without your
understanding what it does, and what it might do that it should not. There's
a lot of bad code floating around out there.

--
HTH,

Kevin Spencer
Microsoft MVP
..Net Developer
What You Seek Is What You Get.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top