Visual Basic 6
Visual Basic 6
Navigate To
Home
Tutorials
VB.NET Tutorials
Forums
Articles
External Links
Advertise Here!
Contact Us
Guides
Beginner Guide
Controls Guide
Database Guide
o Introduction to SQL
o Using Data Control
o Using DAO Code
o Using RDO
o Using ADO
o ADO and ListView
o ADO stored procs
o Using Crystal Reports
User login
Username: *
Password: *
Home Tutorials
This tutorial describes how you can use ADO objects in VB6. Now days, almost any time you
write full fledged database application you will want to use ADO. Along with this, as your
applications become more and more complex you will probably not want to rely on Visual
Basic's data controls, but instead use the ADO objects directly. Read on to find out exactly
how this can be done.
Originally Written By TheVBProgramer.
The "Alphabet Soup" of Database Access
Prior to VB6 and the introduction of ADO (ActiveX Data Objects), VB programmers would generally
use DAO (Data Access Objects) to interact with local databases such as MS Access and use RDO
(Remote Data Objects) to interact with client/server databases such as Oracle and SQL Server. The
concept behind Visual Basic ADO was Universal Data Access (UDA), where one database access
method could be used for any data source; it was designed to replace both DAO and RDO. DAO
remains a viable technology for interacting with MS Access databases as it is faster than ADO for that
purpose; however, ADO is more flexible using ADO, one could develop a prototype database
application using MS Access in the back-end, and with a "flick of the wrist" (i.e., with very little coding
changes) "upsize" that same application to use Oracle or SQL Server. As far as RDO is concerned, no
new versions of it have been developed beyond the version that shipped with Visual Basic, and there
are no future plans for it.
In the VB4 and VB5 worlds, RDO was the main method used to interact with client/server databases.
RDO works perfectly fine with VB6, so when folks migrated their VB5 applications over to VB6, little or
no coding changes were required. However, ADO is the preferred method of database access for new
VB6 applications .
This tutorial presents three small sample applications using ADO. All three applications use a local MS
Access database.
The first sample application introduces the ADO Data Control (ADODC) which demonstrates a "quick
and dirty" way to connect to a remote database. The second and third applications use ADO code: the
second allows navigation and searching of a database table; the third allows navigation and updating
on a database table. All three connect to an ODBC Data Source, which must be set up through the
Windows Control Panel. How to do this is described below.
Note: If you have previously set up a DSN for the Biblio database as described in the previous topic
on RDO, you can skip the section on setting up an ODBC data source and resume here.
Follow the steps below to set up an ODBC Data Source (this process is also called "setting up a
DSN", where "DSN" stands for "Data Source Name"). These steps assume Windows 2000 for the
operating system. On other versions of Windows, some steps may vary slightly.
Via Windows Control Panel, double-click on Administrative Tools, then Data Sources (ODBC). The
ODBC Data Source Administrator screen is displayed, as shown below. Click on the System DSN
tab.
Click the Add button. The Create New Data Source dialog box will appear. Select Microsoft Access
Driver (*.mdb) from the list and click the Finish button.
The ODBC Microsoft Access Setup dialog box will appear. For Data Source Name, type Biblio. If
desired, you can type an entry for Description, but this is not required.
Click the Select button. The Select Database dialog box appears. On a default installation of VB6 or
Visual Studio 6, the BIBLIO.MDB sample database should reside in the folder C:\Program
Files\Microsoft Visual Studio\VB98. Navigate to that folder, select BIBLIO.MDB from the file list,
and click OK.
Note: If VB was installed in a different location on your system, navigate to the appropriate folder. If
you do not have the BIBLIO.MDB sample database file on your system at all, you can
download it here. In that case, copy the file to the folder of your choice, and navigate to that
folder to select the database for this step.
When you are returned to the ODBC Microsoft Access Setup screen, the database you selected
should be reflected as shown below. Click OK to dismiss this screen.
When you are returned to the ODBC Data Source Administrator screen, the new DSN should
appear as shown below. Click OK to dismiss this screen.
At this point, the Biblio database is ready to be used with RDO in the sample application.
Start a new VB project, and from the Components dialog box (invoked from the Project ->
Components menu), select Microsoft ADO Data Control 6.0 (SPx) as shown below and click OK.
The ADO Data Control should appear in your toolbox as shown below:
Put an ADO Data Control on your form, and set the properties as follows:
Property
Value
Name
adoBiblio
DataSourceName
Biblio
SQL
Now put three text boxes on the form, and set their Name, DataSource, and DataField properties
as follows:
Name
DataSource
DataField
txtAuthor
adoBiblio
Author
txtAuID
adoBiblio
Au_ID
txtYearBorn
adoBiblio
Year Born
Save and run the program. Notice how it works just like the other data control.
Now change the SQL property of the data control to select * from authors order by author and run
the program again. Notice the difference.
Change the SQL property back to what it was and add three command buttons to the form, and
set their Name and Caption properties as follows:
Name
Caption
cmdNameOrder
Order by Name
cmdYearOrder
Order by Year
cmdIDOrder
Order by ID
Save and run the program and see what happens when you click the buttons.
Note: If you have previously downloaded and set up a DSN for the Property database as described in
the previous topic on RDO, you can skip the set up steps below and resume here.
Sample applications 2 and 3 use a database called PROPERTY.MDB and can be downloaded here.
The Property database contains just one table called "Property". The columns of this table are defined
as follows:
Column Name
Data Type
Notes
PROPNO
EMPNO
ADDRESS
Text (20)
CITY
Text (15)
STATE
Text (2)
ZIP
Text (5)
NEIGHBORHOOD
Text (15)
HOME_AGE
BEDS
BATHS
Number (Single)
FOOTAGE
ASKING
BID
SALEPRICE
Before coding or running sample application 2 or 3, you must set up an ODBC data source as was
done for the previous sample application.
After downloading the file, move it to the folder of your choice. Then follow the exact same steps as
before to set up the DSN, with these two exceptions:
(1) On the ODBC Microsoft Access Setup dialog box, type PropDB for the Data Source Name.
(2) In the Select Database dialog box, navigate to the location where you have placed the
PROPERTY.MDB file.
Sample Application 2
To build Sample Application 2, start a new VB project and perform the following steps.
From the Project -> References menu, check Microsoft ActiveX Data Objects 2.x (where x is the
highest version that you have on your system) and click OK.
This project uses the StatusBar control, so include the Microsoft Windows Common Controls 6.0
(SP6) from the Components dialog box, accessed from the Project -> Components menu.
Create the form shown below. The names of the text boxes in the top frame are shown in the form.
Set the Enabled property of the frame to False, which will automatically disable all of the textboxes
within it, which is desired because this application does not allow updating of the data. The settings
for the other controls are given below.
Name
Caption
cmdMoveFirst
<<
cmdMovePrevious
<
cmdMoveNext
>
cmdMoveLast
>>
The text box in the middle of the form has the following properties:
Name
txtCurrentQuery
MultiLine
True
Locked
True
Name
Caption
Enabled
cmdAllData
True
cmdGetData
False
Name
Caption
chkCriteria(0)
EmpNo
chkCriteria(1)
City
chkCriteria(2)
State
Name
Caption
Enabled
lblCriteria(0)
False
lblCriteria(1)
Like
False
lblCriteria(2)
Like
False
Name
Caption
Enabled
txtCriteria(0)
EmpNo
False
txtCriteria(1)
City
False
txtCriteria(2)
State
False
Place the StatusBar on the form and set its Style property to 1 sbrSimple.
2. Code the General Declarations section as shown below. Here, two ADO objects,
ADODB.Connection and ADODB.Recordset, are defined at the form level.
The ADODB.Connection object represents an open connection to a data source and a specific
database on that data source, or an allocated but as yet unconnected object, which can be
used to subsequently establish a connection.
The ADODB.Recordset object represents the rows that result from running a query,
Option Explicit
3. Code the Form_Load event. Here, the connection object variable mobjADOConn is made available
for use by setting it to a new instance of ADODB.Connection. Then, the ConnectionString
property and the Open method of the ADODB.Connection object are used.
The ConnectionString property takes a string with various arguments delimited by semicolons. When
using a DSN as we are in this sample application, you typically need just the DSN name, the
user id, and the password. The Open method then opens the connection to the database.
Exit Sub
LocalError:
MsgBox Err.Number & " - " & Err.Description
End Sub
4. Code the cmdAllData_Click event, which sets or resets the ADODB.Recordset object with a query
to display all the rows in the table. The opening of the recordset takes place in the
OpenNewRecordset subprocedure, called from this event procedure.
LocalError:
MsgBox Err.Number & " - " & Err.Description
End Sub
Here, the recordset object mobjADORst is made available for use by setting (or resetting) it to a new
instance of ADODB.Recordset.
The CursorLocation property is then set to the built-in constant adUseClient. The term "cursor" refers
to the temporary rows of a recordset. The cursor location determines whether the cursor is
stored on the client or the server, specified by the values adUseClient and adUseServer,
respectively. Server-side cursor (adUseServer) is the default. There are tradeoffs using both
types of cursors. Client-side cursors can take a long time to build because the data must be
pulled over to the client, but once built, traversing the cursor is usually very fast. Client-side
cursors often support more features than server-side cursors (the reason this sample
application is using a client-side cursor is because we want to use AbsolutePosition property
later, which only works with a client-side cursor). On the other hand, server-side cursors
usually build faster but often support fewer features that client-side cursors.
The Open method of the recordset is then executed. The Open method has the following syntax:
The Source argument is an optional variant that evaluates to a valid Command object, SQL
statement, table name, stored procedure call, or filename of a persisted recordset.
The ActiveConnection argument is an optional variant that evaluates to a valid Connection object
variable name or a string containing connection string parameters.
The CursorType argument is an optional value that determines the type of cursor that the provider
should use when opening the recordset. The possible values and their descriptions are given
below:
Value
Description
adOpenForwardOnly
adOpenStatic
Used to open a static cursor. A static cursor is a static copy of the data in the
source. Once created, no changes made by other users propagate to the rec
recordset never changes. Note: Client side cursors (like the one used in this
application) use only adOpenStatic for CursorTypes regardless of which Curs
you select.
adOpenDynamic
adOpenKeyset
Used to open a keyset cursor. Keyset cursors are like dynamic cursors, exce
additions made by other users are not visible in the recordset. The recordset
by changes and deletions, however.
The LockType argument is an optional value that determines the type of locking that the provider
should use when opening the recordset. The possible values and their descriptions are given
below:
Value
Description
adLockReadOnly
(default) Specifies read-only locking. Records can be read, but data cannot
changed, or deleted. This is the locking method used with static cursors an
only cursors.
adLockPessimistic
adLockOptimistic
Specifies optimistic locking. The provider locks records only when you call
method, not when you start editing.
adLockBatchOptimistic
Specifies optimistic batch locking. Records are locked in batch update mod
opposed to immediate update mode. This option is required for client-side c
The Options argument is an optional Long value that indicates how the Source should be evaluated.
The possible values and their descriptions are given below:
Value
Description
adCmdText
adCmdTable
adCmdStoredProc
adCmdUnknown
Indicates that the type of command in the CommandText argument is not kno
that the provider should attempt to interpret it. Typically results in poor perform
adExecuteAsync
adFetchAsync
Indicates that the remaining rows after the initial quantity specified in the Cac
property should be fetched asynchronously.
txtCurrentQuery.Text = mstrSQL
End Sub
6. Create the user-defined subprocedure DataLoad. This subprocedure gets the data from the
recordset and puts each field into a text box. Data from the recordset is accessed via the
Fields collection.
The Fields collection in ADO works identically to the Fields collection in DAO. A field can be referenced
with or without specifying Fields, either by the field name in quotes or by its ordinal position in
the resultset. The field can also be referenced with the bang (!) operator. All of the following
would be valid ways of referencing the field "propno":
mobjADORst.Fields("propno")
mobjADORst ("propno")
mobjADORst.Fields(0)
mobjADORst(0)
mobjADORst!propno
txtCity.Text = mobjADORst.Fields("city")
txtState.Text = mobjADORst.Fields("state")
txtZip.Text = mobjADORst.Fields("zip")
Call SetRecNum
Exit Sub
LocalError:
MsgBox Err.Number & " - " & Err.Description
End Sub
7. Create the user-defined subprocedure SetRecNum. This sub displays the number of the current
record at the bottom of the screen. The AbsolutePosition and RecordCount properties of the
Recordset are used here.
The AbsolutePosition property specifies the current row in a recordset. Note: For AbsolutePosition to
return a valid value with Access (Jet) databases (like the one used in the sample application),
the CursorLocation must be set to adUseClient. An invalid value (-1) will be returned if
adUseClient is specified.
The RecordCount property the total number of rows in the recordset. Note: RecordCount will not
return a valid value with all cursor types (for example, RecordCount will return -1 with a
forward-only cursor.) To ensure a valid RecordCount value, use either adOpenKeyset or
adOpenStatic as the CursorType for server side cursors or use a client side cursor.
8. Code the events for the navigation buttons as shown below, using the recordset "Move" methods to
move to the first, last, next, or previous record, respectively.
'---------------------------------------------------------------------------Private Sub cmdMoveFirst_Click()
'---------------------------------------------------------------------------On Error GoTo LocalError
mobjADORst.MoveFirst
Call DataLoad
Exit Sub
LocalError:
MsgBox Err.Number & " - " & Err.Description
End Sub
mobjADORst.MoveLast
Call DataLoad
Exit Sub
LocalError:
MsgBox Err.Number & " - " & Err.Description
End Sub
mobjADORst.MoveNext
If mobjADORst.EOF Then
Beep
mobjADORst.MoveLast
End If
Call DataLoad
Exit Sub
LocalError:
MsgBox Err.Number & " - " & Err.Description
End Sub
mobjADORst.MovePrevious
If mobjADORst.BOF Then
Beep
mobjADORst.MoveFirst
End If
Call DataLoad
Exit Sub
LocalError:
MsgBox Err.Number & " - " & Err.Description
End Sub
9. When one of the check boxes is clicked, the label and text box next to it should be enabled (or
disabled, if clicking the check box unchecks it). Note also that the cmdGetData button (the
one with the "Run Query Now" caption) should only be enabled if one of the checkboxes is
checked.
'when the user clicks on a check box, enable the label and text
'box that go with it.
If chkCriteria(Index).Value = vbChecked Then
txtCriteria(Index).Enabled = True
lblCriteria(Index).Enabled = True
txtCriteria(Index).SetFocus
txtCriteria(Index).SelStart = 0
txtCriteria(Index).SelLength = Len(txtCriteria(Index).Text)
' enable the 'Run Query Now' button only if a box is checked.
cmdGetData.Enabled = True
Else
txtCriteria(Index).Enabled = False
lblCriteria(Index).Enabled = False
End If
End Sub
10. After the user has selected which fields to use and entered values in the text boxes, they click the
cmdGetData button to create a new recordset with new data. Note that if the user selects
(checks) a field, but does not enter search criteria in the corresponding textbox, an error
message is generated and the query is not run.
blnFirstOne = False
mstrSQL = mstrSQL & "empno = " & txtCriteria(0).Text
End If
If chkCriteria(1).Value = vbChecked Then
If txtCriteria(1).Text = "" Then
MsgBox "City criteria is missing. Query not run.", _
vbExclamation, _
"ADO Example"
Exit Sub
End If
If blnFirstOne = False Then
mstrSQL = mstrSQL & " and"
End If
blnFirstOne = False
mstrSQL = mstrSQL & " city like '" & txtCriteria(1).Text & "'"
End If
If chkCriteria(2).Value = vbChecked Then
If txtCriteria(2).Text = "" Then
MsgBox "State criteria is missing. Query not run.", _
vbExclamation, _
"ADO Example"
Exit Sub
End If
If blnFirstOne = False Then
mstrSQL = mstrSQL & " and"
End If
blnFirstOne = False
mstrSQL = mstrSQL & " state like '" & txtCriteria(2).Text & "'"
End If
OpenNewRecordset
'make sure that the query did not return 0 rows:
If mobjADORst.EOF Then
MsgBox "Your query (" & mstrSQL & ") returned no records! " _
& "The default query to return all records will now be rerun.", _
vbExclamation, _
"ADO Example"
'reload the form with all the records
cmdAllData_Click
Else
MsgBox "Your query returned " & mobjADORst.RecordCount & " records.", _
vbInformation, _
"ADO Example"
'load data into the text boxes
Call DataLoad
End If
Exit Sub
LocalError:
MsgBox Err.Number & " - " & Err.Description
End Sub
11. Save and run. Note: When entering the "Like" criteria for City and/or State, you can use the
wildcard character % to represent any number of characters and the wildcard character _
(underscore) the represent a single character. For example, entering "M%" for the City criteria
would return all rows where the city field begins with the letter "M".
Sample Application 3
Sample Application 3 demonstrates how to add, update, and delete records with ADO.
When the application is first run, the user is prompted to enter a minimum asking price to possibly limit
the number of records they want to work with (i.e., "I only want to work with properties that are selling
for $200,000 or more). If the user wants to work with all properties, they would simply accept the
default of 0 from the prompt. If the user clicks the Cancel button, the application will end.
Once the user has entered the minimum asking price, the main screen of the application is displayed.
Initially, the screen is in "browse" mode, where the user can use the navigation buttons to move to the
first, previous, next or last record. The data cannot be edited in this mode. If they want to initiate an
add or an update, delete a record, or exit the application, they may do so via the appropriate button.
Saving or cancelling is not applicable in this mode, so those buttons are disabled.
If the user clicks the Add button, the fields on the screen are enabled and cleared, and the user can
enter the information for the new property. All buttons except Save and Cancel are now disabled. After
the user has made entries in the fields, he or she would click Save to add the new record to the
database table, or, if they changed their mind, would click Cancel to discard the new record. In either
case (clicking Save or Cancel) the user is returned to browse mode. When Save is clicked, the
application validates the entries and will only save the record if all fields pass edit (otherwise, a
message will appear indicating the problem entry and focus will be set to the problem field).
If the user clicks the Update button, the fields on the screen are enabled and the user can modify any
or all of the fields (except for the Property Number, which is the primary key of the table). All buttons
except Save and Cancel are now disabled. After the user has made modifications in the desired fields,
he or she would click Save to update the record to the database table, or, if they changed their mind,
would click Cancel to discard the changes. In either case (clicking Save or Cancel) the user is
returned to browse mode. When Save is clicked, the application validates the entries and will only
save the record if all fields pass edit (otherwise, a message will appear indicating the problem entry
and focus will be set to the problem field).
If the user clicks the Delete button, the user is asked to confirm that they want to delete the current
record. If they respond Yes, the record is deleted from the database table, and the main screen shows
the next record in the table.
To build Sample Application 3, start a new VB project and perform the following steps.
From the Project -> References menu, check Microsoft ActiveX Data Objects 2.x Library and click
OK.
This project uses the StatusBar control, so include the Microsoft Windows Common Controls 6.0
(SP6) from the Components dialog box, accessed from the Project -> Components menu. Check
this item and click OK.
Create the form shown below. The settings for the various controls are given below.
There are nine textboxes in the main frame of the form. The names and MaxLength settings for
these are given below:
Name
Properties
txtPropNo
MaxLength: 5
txtEmpNo
MaxLength: 4
txtAddress
MaxLength: 20
txtCity
MaxLength: 15
txtState
MaxLength: 2
txtZip
MaxLength: 5
txtBeds
MaxLength: 1
txtBaths
txtAsking
Name
Caption
cmdMoveFirst
<<
cmdMovePrevious
<
cmdMoveNext
>
cmdMoveLast
>>
cmdAdd
Add
cmdUpdate
Update
cmdDelete
Delete
cmdSave
Save
cmdCancel
Cancel
cmdExit
Exit
All controls on your form should have their TabIndex property set such that the tabbing order is
correct.
Add a Module to the project, name it modCommon, and enter the code shown below. The code
contains procedures described as follows:
CenterForm
ValidKey
ConvertUpper
SelectTextBoxText
Sub to highlight the text of a textbox when it receives focus. Used in the GotFocu
event of a textbox.
TabToNextTextBox
UnFormatNumber
Function to strip out non-numeric characters (dollar signs, commas, etc.) from a
formatted number.
Option Explicit
With pobjForm
.Top = (Screen.Height - .Height) / 2
.Left = (Screen.Width - .Width) / 2
End With
End Sub
If pintKeyValue < 32 _
Or InStr(pstrSearchString, Chr$(pintKeyValue)) > 0 Then
'Do nothing - i.e., accept the control character or any key
' in the search string passed to this function ...
Else
'cancel (do not accept) any other key ...
pintKeyValue = 0
End If
ValidKey = pintKeyValue
End Function
ConvertUpper = pintKeyValue
End Function
With pobjTextbox
.SelStart = 0
.SelLength = Len(.Text)
End With
End Sub
'----------------------------------------------------------------------------
End Sub
End Function
Code the General Declarations section as shown below. Here, as in the previous sample
application, two ADO object variables, mobjADOConn and mobjADORst, are defined at the form
level, as are some other form-level variables that will be needed.
Option Explicit
Code the Form_Load event as shown below. In it, a programmer-defined Sub named
GetMinimumAsking is called (that routine is the one that displays the initial prompt to the user to
enter the minimum asking price of the properties they want to work with). Then, the variant array
mavntUSStates is loaded with the 50 US state abbreviations, needed for validating the state input
by the user. This is followed by a call to the CenterForm sub. Then, the ADO connection object
(mobjADOConn) is instantiated, its ConnectionString property is set, and the Open method is
invoked so that we can use the Property database in the application. This is followed by a call to
the programmer-defined Sub GetPropertyData (which runs the query to create the recordset that
will be used to browse the Property table records), followed by a call to the programmer-defined
Sub SetFormState (which enables and disables controls at the appropriate time).
' obtain the minimum asking price for the properties to be worked with
GetMinimumAsking
' load the array of states to be used for validation
mavntUSStates = Array("AK", "AL", "AR", "AZ", "CA", "CO", "CT", "DC", _
"DE", "FL", "GA", "HI", "IA", "ID", "IL", "IN", _
"KS", "KY", "LA", "MA", "MD", "ME", "MI", "MN", _
"MO", "MS", "MT", "NC", "ND", "NE", "NH", "NJ", _
"NM", "NV", "NY", "OH", "OK", "OR", "PA", "RI", _
"SC", "SD", "TN", "TX", "UT", "VA", "VT", "WA", _
"WI", "WV", "WY")
'center the form:
CenterForm Me
' Connect to the Property database:
Set mobjADOConn = New ADODB.Connection
mobjADOConn.ConnectionString = "DSN=PropDB;Uid=admin;Pwd=;"
mobjADOConn.Open
Call GetPropertyData
SetFormState False
Exit Sub
LocalError:
MsgBox Err.Number & " - " & Err.Description
End Sub
Code the GetMinimumAsking Sub, which uses the InputBox function to prompt to the user to enter
the minimum asking price of the properties they want to work with. The resulting value is then stored
in the form-level variable mdblMinAsking.
strInputBoxPrompt = "Enter the minimum asking price (for example, 200000) "
_
& "for the properties that you want to work with this session." _
& vbNewLine _
& "To work with ALL properties, leave the default of zero."
strAsking = InputBox(strInputBoxPrompt, "Minimum Asking Price", "0")
If strAsking = "" Then
' user clicked Cancel button on the input box, so end the app
End
End If
mdblMinAsking = Val(strAsking)
End Sub
Code the GetPropertyData Sub, which builds the SQL to get the property records meeting the
minimum asking price condition. The Recordset object is then instantiated, its CursorLocation
property is set, and its Open method is invoked to execute the SQL and return the resultset. This is
done in a loop in case the resultset does not return any records due to the fact no records in the table
met the asking price condition. In that situation, the user is given the opportunity to specify a different
asking price value. Following this, the programmer-defined Sub PopulateFormFields is called (which
displays the fields from the current record in their corresponding textboxes on the form).
End Sub
Code the PopulateFormFields Sub, which assigns the fields from the current record to their
corresponding textboxes on the form. Note that the gblnPopulating Boolean variable is set to True
prior to the assignments and set to False after the assignments. This value is used to control whether
or not certain code executes in the event procedures for some of these textboxes. The Sub
SetRecNum is then called.
gblnPopulating = True
Call SetRecNum
Exit Sub
LocalError:
MsgBox Err.Number & " - " & Err.Description
End Sub
Code the SetRecNum Sub. This sub is identical to the one used in Sample Application 2. It displays
the number of the current record at the bottom of the screen using the AbsolutePosition and
RowCount properties of the Recordset object.
Code the SetFormState Sub, which takes in a Boolean argument used to set the Enabled property of
the controls on the form. Based on whether the value True or False is passed to this sub, this sub
ensures that the textboxes are enabled for adds and updates and disabled for browsing; it also
ensures that the various command buttons are enabled or disabled at the appropriate time. This Sub
also sets the form-level Boolean variable mblnUpdatePending.
txtPropNo.Enabled = pblnEnabled
txtEmpNo.Enabled = pblnEnabled
txtAddress.Enabled = pblnEnabled
txtCity.Enabled = pblnEnabled
txtState.Enabled = pblnEnabled
txtZip.Enabled = pblnEnabled
txtBeds.Enabled = pblnEnabled
txtBaths.Enabled = pblnEnabled
txtAsking.Enabled = pblnEnabled
cmdSave.Enabled = pblnEnabled
cmdCancel.Enabled = pblnEnabled
cmdAdd.Enabled = Not pblnEnabled
cmdUpdate.Enabled = Not pblnEnabled
cmdDelete.Enabled = Not pblnEnabled
cmdExit.Enabled = Not pblnEnabled
cmdMoveFirst.Enabled = Not pblnEnabled
cmdMoveNext.Enabled = Not pblnEnabled
cmdMovePrevious.Enabled = Not pblnEnabled
cmdMoveLast.Enabled = Not pblnEnabled
mblnUpdatePending = pblnEnabled
End Sub
Code the Form_Unload event. In it, the form-level Boolean variable mblnUpdatePending is tested to
see if (well, an update is pending i.e., whether an add or update is in progress). If the user is in the
middle of an add or update and then clicks the "X" button on the upper-right corner of the form, they
will receive the message that they must save or cancel prior to exiting the application, and the form
will NOT be unloaded (because we are assigning a non-zero value to the Cancel argument in that
situation). Provided that an add or update is not in progress, we set the database objects to Nothing
and the Unload will complete.
If mblnUpdatePending Then
MsgBox "You must save or cancel the current operation prior to exiting.", _
vbExclamation, _
"Exit"
Cancel = 1
Else
Set mobjADORst = Nothing
Set mobjADOConn = Nothing
End If
End Sub
Code the events for the various Textboxes as shown below. The code in these events ensure the
following:
For all, highlight the text in the textbox when it receives focus.
For all but the last textbox, if the maximum number of characters typed into the textbox is
reached, auto-tab to the next textbox.
Only numeric digits should be entered into the property number, employee number, zip codes,
and beds textboxes.
Only numeric digits and optionally one decimal point should be entered into the baths and asking
textboxes.
When the asking textbox receives focus, the value in there should be unformatted. When the
asking textbox loses focus, its value should be formatted as currency.
' property #
Private Sub txtPropNo_GotFocus()
SelectTextBoxText txtPropNo
End Sub
Private Sub txtPropNo_KeyPress(KeyAscii As Integer)
KeyAscii = ValidKey(KeyAscii, gstrNUMERIC_DIGITS)
End Sub
Private Sub txtPropNo_Change()
TabToNextTextBox txtPropNo, txtEmpNo
End Sub
' emp #
Private Sub txtEmpNo_GotFocus()
SelectTextBoxText txtEmpNo
End Sub
Private Sub txtEmpNo_KeyPress(KeyAscii As Integer)
KeyAscii = ValidKey(KeyAscii, gstrNUMERIC_DIGITS)
End Sub
Private Sub txtEmpNo_Change()
TabToNextTextBox txtEmpNo, txtAddress
End Sub
' address
Private Sub txtAddress_GotFocus()
SelectTextBoxText txtAddress
End Sub
Private Sub txtAddress_Change()
TabToNextTextBox txtAddress, txtCity
End Sub
' city
Private Sub txtCity_GotFocus()
SelectTextBoxText txtCity
End Sub
' state
Private Sub txtState_GotFocus()
SelectTextBoxText txtState
End Sub
Private Sub txtState_KeyPress(KeyAscii As Integer)
KeyAscii = ConvertUpper(KeyAscii)
End Sub
Private Sub txtState_Change()
TabToNextTextBox txtState, txtZip
End Sub
' zip
Private Sub txtZip_GotFocus()
SelectTextBoxText txtZip
End Sub
Private Sub txtZip_KeyPress(KeyAscii As Integer)
KeyAscii = ValidKey(KeyAscii, gstrNUMERIC_DIGITS)
End Sub
Private Sub txtZip_Change()
TabToNextTextBox txtZip, txtBeds
End Sub
' beds
Private Sub txtBeds_GotFocus()
SelectTextBoxText txtBeds
End Sub
Private Sub txtBeds_KeyPress(KeyAscii As Integer)
KeyAscii = ValidKey(KeyAscii, gstrNUMERIC_DIGITS)
End Sub
Private Sub txtBeds_Change()
TabToNextTextBox txtBeds, txtBaths
End Sub
' baths
Private Sub txtBaths_GotFocus()
SelectTextBoxText txtBaths
End Sub
Private Sub txtBaths_KeyPress(KeyAscii As Integer)
KeyAscii = ValidKey(KeyAscii, gstrNUMERIC_DIGITS & ".")
' if text already has a decimal point, do not allow another ...
If Chr$(KeyAscii) = "." And InStr(txtBaths.Text, ".") > 0 Then
KeyAscii = 0
End If
End Sub
Private Sub txtBaths_Change()
TabToNextTextBox txtBaths, txtAsking
End Sub
End Sub
Private Sub txtAsking_KeyPress(KeyAscii As Integer)
KeyAscii = ValidKey(KeyAscii, gstrNUMERIC_DIGITS & ".")
' if text already has a decimal point, do not allow another ...
If Chr$(KeyAscii) = "." And InStr(txtAsking.Text, ".") > 0 Then
KeyAscii = 0
End If
End Sub
Private Sub txtAsking_LostFocus()
txtAsking.Text = Format$(txtAsking.Text, "Currency")
End Sub
Code the events for the navigation buttons as shown below, using the resultset "Move" methods to
move to the first, last, next, or previous record, respectively.
'---------------------------------------------------------------------------Private Sub cmdMoveFirst_Click()
'---------------------------------------------------------------------------On Error GoTo LocalError
mobjADORst.MoveFirst
Call PopulateFormFields
Exit Sub
LocalError:
MsgBox Err.Number & " - " & Err.Description
End Sub
'----------------------------------------------------------------------------
mobjADORst.MoveLast
Call PopulateFormFields
Exit Sub
LocalError:
MsgBox Err.Number & " - " & Err.Description
End Sub
mobjADORst.MoveNext
If mobjADORst.EOF Then
Beep
mobjADORst.MoveLast
End If
Call PopulateFormFields
Exit Sub
LocalError:
MsgBox Err.Number & " - " & Err.Description
End Sub
mobjADORst.MovePrevious
If mobjADORst.BOF Then
Beep
mobjADORst.MoveFirst
End If
Call PopulateFormFields
Exit Sub
LocalError:
MsgBox Err.Number & " - " & Err.Description
End Sub
Code the Click event for the cmdAdd button. In it, the textboxes are cleared, the SetFormState sub is
called (passing it a parameter of True, which will enable the textboxes and the Save and Cancel
buttons and disable all the other buttons), set the form-level variable mstrUpdateType to "A"
(indicating that an add is pending) and sets focus to the Property Number field.
'---------------------------------------------------------------------------Private Sub cmdAdd_Click()
'----------------------------------------------------------------------------
Code the Click event for the cmdUpdate button. In it, the SetFormState sub is called (passing it a
parameter of True, which will enable the textboxes and the Save and Cancel buttons and disable all
the other buttons), set the form-level variable mstrUpdateType to "U" (indicating that an update is
pending), disables the Property Number field (because it is the primary key and should not be
changed) and sets focus to the Employee Number field.
SetFormState True
mstrUpdateType = "U"
' being that propno is the primary key, it should not be updatable
txtPropNo.Enabled = False
txtEmpNo.SetFocus
Exit Sub
LocalError:
MsgBox Err.Number & " - " & Err.Description
End Sub
Code the Click event for the cmdSave button. The user would click this button after they have
completed entries for an add or update. This sub first invokes the ValidateAllFields function, which
returns a Boolean indicating whether or not all entries passed their edit checks. If not, we exit the sub
and the record is not saved; the user remains in "update pending" mode and has the opportunity to
correct the entries. Provided that validation is successful, the sub proceeds. The mstrUpdateType
variable is checked to see whether we are dealing with an add or an update.
If we are dealing with an add, we invoke the AddNew method of the Recordset object. The AddNew
method prepares a new row you can edit and subsequently add to the Recordset object using the
Update method. After you modify the new row, you must use the Update method to save the changes
and add the row to the result set. No changes are made to the database until you use the Update
method. (The Update method is invoked after the content of the textboxes has been assigned to the
database fields.)
If we are dealing with an update, we can just start modifying the fields (provided an appropriate cursor
type has been selected) unlike DAO and RDO, ADO does not use an Edit method. Changes made
to the current rows columns are copied to the copy buffer. After you make the desired changes to the
row, use the Update method to save your changes or the CancelUpdate method to discard them. (If
you move on to another record without invoking Update, your changes will be lost.)
The content of the textboxes is assigned to the database fields, then the Update method is invoked.
The Update method saves the contents of the copy buffer row to a specified updatable Recordset
object and discards the copy buffer.
The mstrUpdateType variable is checked once again, and if we are dealing with an add, there is some
extra work to do. Although the new record has been added, the original resultset still does not contain
the new record. The Requery method must be invoked, which updates the data in a Recordset object
by re-executing the query on which the object is based. The Find method is then used to position to
the new record. The ADO Find method has the following syntax:
Reset:
SetFormState False
Exit Sub
LocalError:
MsgBox Err.Number & " - " & Err.Description
Resume Reset
End Sub
Code the Click event for the cmdDelete button. The user is first asked to confirm that they want to
delete the record, and if so, the Delete method of the resultset object is invoked, which deletes the
current row in an updatable resultset object. The Requery method is then invoked so that the record is
removed from the resultset that the user is working with. The Find method is then invoked to position
the next record after the deleted one. If it was the last record that was deleted, then we position to the
"new" last record using the MoveLast property. PopulateFormFields must then be called to display the
contents of the new current record.
mobjADORst.Requery
' reposition to one past the record just deleted
mobjADORst.Find "propno > " & txtPropNo.Text
' If it was the last record that was deleted, the Find method will
' come back with EOF, in which case we should MoveLast to position
' us to the "new" last record ...
If mobjADORst.EOF Then mobjADORst.MoveLast
'load data into the text boxes:
Call PopulateFormFields
Exit Sub
LocalError:
MsgBox Err.Number & " - " & Err.Description
End Sub
The ValidateAllFields function, which returns a Boolean value indicating whether or not all fields have
passed validation checks. This function calls upon two "helper" functions: PropertyExists and
ValidState. When the user is doing an add, the PropertyExist function is called to see whether or not
the proposed Property Number is already being used in the Property table. If so, the user is informed
that they can't use that number (because it is the primary key and must be unique) and so they must
use a different number. The ValidState routine is called to ensure that the user has entered a valid US
state. The code for all three functions is shown below.
strSQL = "select count(*) as the_count from property where propno = " &
txtPropNo.Text
objTempRst.Open strSQL, mobjADOConn, adOpenForwardOnly, , adCmdText
If objTempRst("the_count") > 0 Then
PropertyExists = True
Else
PropertyExists = False
End If
End Function
Code the Click event for the cmdCancel button. The user would click this button if, during an add or
update, they decide to abandon the operation. Here, PopulateFormFields is called to reset the
textboxes to their content prior to the user clicking the Add or Update button, and SetFormState is
called with a parameter of False, which causes the textboxes and the Save and Cancel buttons to be
disabled and all other buttons to be enabled.
'---------------------------------------------------------------------------Private Sub cmdCancel_Click()
'----------------------------------------------------------------------------
PopulateFormFields
SetFormState False
End Sub
Code the Click event for the cmdExit button, which issues the Unload Me statement to fire the
Form_Unload event, which will unload the form and end the application.
Unload Me
End Sub
Post to Facebook
Post to Twitter
Add to LinkedIn
Post to Delicious
Post to Digg
Add to Evernote
Similar links
FTP server
How can I use Common Dialog Control in VB6.0 to open WORD, EXCEL,
PowerPoint or any kind of Files?
DSN
This topic is great, but I got confused the first time I looked at it (two years ago).
Why? DON'T USE DSN!!! Why do you say that ADODC is a "quick and dirty" way to
connect to a remote database and carry on using DSN in your connection string????
I am a newbie and wrote my first big application (VB6 ADO/SQL and MS Jet on a server)
two years ago, I learned a lot from various topics on this website which belongs to the best I
could find on the net. (there is a download for each topic-great!)
I started to rewrite my application in VB.Net 2010, but the learning curve is so long. I spent
hundreds of hours writing my application in VB6, conversion to .Net is a joke, it just
produces very dirty Mickey Mouse code. In fact, you must re-write everything.
Thnx in Advance
Thanks
Thanks a million, I am trying to design a Timetable for a school, any ideas
niceee
nice tutorial helpd a,lot
Please give us step by step instructions for easy understanding that how to connect vb6.0 with
oracle 9i.
And also pleas tell us how to create ODBC connections.....
thankyou
tnx .. it help us to practice our program .
please debug it thank you :D
wow ?!
wow ?!
Thank you
This tutorial is the most useful one about "VB6 and ADO" that I've read. Thank you very
much.
hehe
thank you so much .. it is so helping ty
thanhk so much!!!!! :)
thanhk so much!!!!! :)
thank u guys!
thank u guys!
Exteremely Good
The Tutorial is exteremely good and useful.
2 SQL
3 Name
the property name is ok but i cannt find the rest of the two properties in property window of
ado. kindly help.
i also want to know how i can use data reports in vb and how to print them.
i m waiting for your favorable reply
thanks & regards
ado connection
is there another way in connecting access database to a vb program? just the simpler one,
thanks for immediate reply(kindly show the codes please.),
C*
hi i want to try my self to appreciate programming..but suddenly i encounter some errors with
my system,that's whyi try to ask some opinion on how to make good and specific system...
Sorry! I missed
Sorry! I missed activeconnection argument.
Database in vb 6.0
Hello,
Congrats on the great tutorial. Iam making a program that can look up for peoples names
from an access database using the data set
Ex: "private db as database" method...
In my program, i want to avoid the case sensitive problem.... For Example, if you are
searching for the record "Washington" and if you type "Washinton" the real record (i.e
Washington) should be displayed...
Pls send ur reply thru email.... [email protected]
Thankyou Very Much,
Asjad
thank you!
thank you!
help
can you teach me how to get and save data using visual basic 6 that is connected in a database
(ms access 2007)
Help on Vb6.0
hello great friends, pls am a computer science student here in Nigeria, the system here is crap.
theories upon theories with no practicals, i wish to build myself personal and am starting with
vb6.0, but i dont know where i can get a free ebook or something that is gonna teach me
vb6.0 right from scratch. if anyone has any help for me, pls contact me with
[email protected] i will be very greatful. thanks
thanks
that's a very fascinating work using ADO!please email me your form please for me to learn
more.
thank you again!
Excellent one!
This is really a good one and that really helped me to complete my hobby project in VB
which involves lot of DB interactions, with the view that I am a biginner to VB.
about vb notes
ss hellow...........sir,
i like vb 6.0 programing lg.
also this notes have helpsus for everyone vb programer.
Thank u..
This is the best tutorial ...,thank you very much
INDEX HELP
Hi, my friend, your info its good, im from mexico, and i want to know how to ad an index on
my form, cause i want to put the name in a text box and the other information like email and
other things for that name apears in others text items can you help me ???
thanks.
Database and VB
Thanks for your tutorial, I am planning to make any program with database to replace my
Access program.
It,s helpfull.
Thanks
GREAT JOB
ITS A VERY VERY USEFUL RESOURCE,FOR LOOP CAN BE USED TO CLEAR THE
FIELDS AND VARIABLE NAMES ARE SOMETIMES OVERHEAD TO UNDERSTAND.
SUPERB TUTORIAL
Sun, 02/28/2010 - 10:34 Kumar Kartik Chandra Prasad Mahato (not verified)
Wonderful...............
what a tutorial.............
Great job..........
plz email me of some code to search a record(EmpNo)....
Thanks alot
Hi
Thanks alot for fantastic job
If possible, please write about DataReport in visual basic
Good Bye
Help
i m using Visual Basib 6.0 and and MS-Access database..my database is on Web Server and
want to connect tht database from VB...how can i......?
plz Help me...
Thanks & Regards,
Nikunj
local pc and do create your system DSN Connection or try something else like DSN-less
connection.
Regards.
tobz
Great
Thank you very much....
great......
help
i always get an error 445 object doesnt support this action which points to the recodset.update
ADO tutorial
Iam so glad i found the right website for the VB6 tutorial it really help me a lot. Thanks a lot.
Question: When am going to enable the Reference :Microsoft ActiveX Data Object 2.7
library i have found error: Name conflicts with existing module , project or object library.
Please help me what im going to do?
...
Great Tutorial, It helped me a lot thank you very much....
HELP!!!
can you please help me in my project..
i find it hard to fetch data from my database
to populate the fields of my listview box...
please send me some codes..
..by the way that was a great tutorial...very informative..
Kudos
Superb
Cudos!
I regret not having seen this before today.
I wonder if you have similar articles for C# or
May be for VS 2005 etc
Congratulations
GREAT!
Hi
gReAt WeBsItE & GrEaT tUtOrIaL
i'm thankful.
Help
As I'm a Diploma in Computer Science student doing my final Sem.. I'm doing a project on
LIBRARY MANAGEMENT SYSTEM... So please help me sir in preparing me it.......
Database?
can anybody please tel me where can i find second database?That is propery Database..I am
not able to find that database.
katoto...
you may have that.. just go on the MENU bar... look 4 the Add Ins. then, click visual database
manager
...then VisData windows appear, choose on the FILE menu...
....NEW --->> then the database sources you may use selection will show, but i recommend
you to choose MS-Access Version 7.0 it is easier to
manipulate your database, rather than other.
thank you, i hope it helps!
VB6
Hi, Why visual basic can't recognized the access 2000 file format? Help me pls.. ThankYou!!
Thats called
Thats called computerization, have nice and healthy life.
need help
pls. help me to make a program about library inventory system, wherein the librarian can
identify which books are borrowed and which are available, thanks!!
error
Put the following code in the cmdNameOrder_Click event:
adoBiblio.SQL = "select * from authors order by author"
adoBiblio.Refresh
Put the following code in the cmdYearOrder_Click event:
adoBiblio.SQL = "select * from authors order by [year born]"
adoBiblio.Refresh
Put the following code in the cmdIDOrder_Click event:
adoBiblio.SQL = "select * from authors order by au_id"
adoBiblio.Refresh
Save and run the program and see what happens when you click the buttons.
U will get method or data member not found.
remove the .SQL and replace by .RecordSource
I dnt knw if there are more errors..
best tutorials
i think this is the best tutorial for vb+database on the internet
Great Tutorial
Great Tutorial cum article
Very helpful mostly to students
help me please!
How am i going to update a single field in just a single click ?
Ex.
Book (field name on the database)
''''''''''''''''''''''''''
''''''''''''''''''''''''''
Book '
''''''''''''''''''''''''''
'''''''''''''''''''''''''''
'''''''''''''''''''''''''''
Science
''''''''''''''''''''''''''
Mathematics
''''''''''''''''''''''''''
English
'''''''''''''''''''''''''''
how can i update all of the content of book(field name) in just a single click?
What I'm trying to say is to make all of the contents of the book = "" just a single click...
just like this:
''''''''''''''''''''''''''
''''''''''''''''''''''''''
Book '
''''''''''''''''''''''''''
'''''''''''''''''''''''''''
(no text)
''''''''''''''''''''''''''
(no text)
''''''''''''''''''''''''''
(no text)
'''''''''''''''''''''''''''
please help me..
thankz...
Very Nice
Very excellent tutorial ,it helps me lot!
Thanks a lot!!
Excellent Work!! It helped me finally understand how ADODB actually works. this is a
website i'd recommend top all my friends!!!
Thanks a lot again!!!!
hi
pls. send to me this..... i need your help...
Pls. enumerate the procedures in wc a VB program can access a DB using data control...
using code and in the properties window...
What are the advantages and disadvantages of accessing a DB in code? in properties
windows..
pls. reply back
whatta article
whatta article
plzzzz
waw your tutorial so excellent,,but can u help me in my program? how to search a
record?..plzzz tnx
The program runs as expected but I'm concerned about having to use different code. Does
anybody have any ideas?
Thanks a lot!
Hi! Thank you so much for the tips and sample programs and codes in programming. It was
really of great help to me. I hope I will be able to share some of my programs soon. :)
Computerized registration
im a new bie in programming...can anyone help me to do a computerized registration in
different type of organizaton using microsoft access in VB6...pls, thanks and god bless.....
Hi
Excellent Article.... Keep it up
Marvelous
Thank you very much. This tutorial DOES HELP me a lot to understand ADO with Visual
Basic. I manage to learn a lot fundamental but essential and neccessary knowledge about VB.
thank you. bless you~
Great Article
Thank You very much. I was looking for a tutorial to learn the basics of ADO and your step
by step examples are excellent.
help
I'm trying to update something and a run time error occurs, its
runtime error 40002:
01000:[Microsoft][ODBC SQL Server Driver]Command has been aborted
can anyone help me with this???
nad
good work
keep it up... good work.....
wow!!!
it helps me a lot to learn ADO database method.. Thanks!
Good work
This is how a tutorial should be. Especially the fact that there are three tutorials in
progressive complexity with about the right increase of complexity from one to the other.
Thank you
Mo
Unless otherwise noted, all content on this site and in the source samples is Copyrighted
2011 by the owner of vb6.us. All rights reserved - Contact Information