104
Visual Basic 6 (VB6) RSS: Site Feed Navigate To Home Tutorials Source Code Samples Add Your Tutorial VB.NET Tutorials Forums Articles External Links Advertise Here! Contact Us Guides Beginner Guide Controls Guide o Database Guide Introduction to SQL Using Data Control Using DAO Code Using RDO

Visual Basic 6 (VB6)

Embed Size (px)

DESCRIPTION

visual basic tutorial

Citation preview

Page 2: Visual Basic 6 (VB6)

Using Crystal Reports

User login

Username: *

Password: *

Create new account

Request new password

Home › Tutorials

Visual Basic & ADO TutorialLevel:

Rank:

 

 

 

 

 

(3 votes)

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

Page 3: Visual Basic 6 (VB6)

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 .

 

About this Tutorial

 

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.

 

Setting Up an ODBC Data Source

 

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.

Page 4: Visual Basic 6 (VB6)

 

         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.

 

Page 5: Visual Basic 6 (VB6)

 

         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.

 

 

Page 6: Visual Basic 6 (VB6)

         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.

 

Page 7: Visual Basic 6 (VB6)

 

         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.

 

 

Page 8: Visual Basic 6 (VB6)

At this point, the Biblio database is ready to be used with RDO in the sample application.

 

Sample Application 1: Using the ADO Data Control (ADODC)

 

To build the first sample application, follow the steps below.

 

         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:

 

Page 9: Visual Basic 6 (VB6)

 

         Put an ADO Data Control on your form, and set the properties as follows:

 

Property Value

Name adoBiblio

DataSourceName Biblio

SQL select * from authors

         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

 

Page 10: Visual Basic 6 (VB6)

         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

 

         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.

Page 11: Visual Basic 6 (VB6)

 

A screen-shot of the sample app at run-time is shown below:

 

 

 

Download the project files for this sample application here.

 

 

Sample Applications 2 and 3: Using ADO Code

 

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:

Page 12: Visual Basic 6 (VB6)

 

Column Name Data Type Notes

PROPNO Number (Long Integer) A number that uniquely identifies the

property in the table. Should be treated

as the Primary Key (although it is not

defined as such in the sample

database).

EMPNO Number (Long Integer) A number that identifies the real estate

agent selling the property. In a real

system, this would be the foreign key to

the employee number in an Employee

table (such a table is not present in the

sample database).

ADDRESS Text (20) The street address of the property.

CITY Text (15) The city where the property is located.

STATE Text (2) The state where the property is located

(2-character US state abbreviation).

ZIP Text (5) The zip code where the property is

located.

NEIGHBORHOOD Text (15) The descriptive name of the

neighborhood in which the property is

located.

HOME_AGE Number (Long Integer) Age in years of the home. (A better

table design choice would be to have

this field be the date in which the

property was built and have the

application compute the age based on

the current date.)

BEDS Number (Long Integer) Number of bedrooms in the property.

BATHS Number (Single) Number of bathrooms in the property

Page 13: Visual Basic 6 (VB6)

(allows for a decimal value such as 2.5,

indicating 2 ½ bathrooms – i.e. 2 full

bathrooms and 1 "powder room").

FOOTAGE Number (Long Integer) The footage of the property.

ASKING Number (Long Integer) Asking price of the property in whole

dollars.

BID Number (Long Integer) Bid amount of the potential buyer in

whole dollars.

SALEPRICE Number (Long Integer) Sale price (amount the property actually

sold for) in whole dollars.

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.

 

Page 14: Visual Basic 6 (VB6)

 

         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.

 

Page 15: Visual Basic 6 (VB6)

 

         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.

 

Page 16: Visual Basic 6 (VB6)

 

The navigation buttons have the following properties:

 

Name Caption

cmdMoveFirst <<

cmdMovePrevious <

cmdMoveNext >

cmdMoveLast >>

 

 

The text box in the middle of the form has the following properties:

 

Name txtCurrentQuery

Page 17: Visual Basic 6 (VB6)

MultiLine True

Locked True

 

The command buttons have the following properties:

 

Name Caption Enabled

cmdAllData Reload All Records True

cmdGetData Run Query Now False

 

In the "Select Criteria" frame:

 

The check boxes are an array:

Name Caption

chkCriteria(0) EmpNo

chkCriteria(1) City

chkCriteria(2) State

 

The labels are also an array:

Name Caption Enabled

lblCriteria(0) = False

lblCriteria(1) Like False

lblCriteria(2) Like False

 

The textboxes are also an array:

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.

Page 18: Visual Basic 6 (VB6)

 

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

 

Dim mobjADOConn As ADODB.Connection

Dim mobjADORst As ADODB.Recordset

Dim mstrSQL As String

 

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.

 

'-----------------------------------------------------------------------

------

Private Sub Form_Load()

Page 19: Visual Basic 6 (VB6)

'-----------------------------------------------------------------------

------

 

'set up the form and connect to the data source

On Error GoTo LocalError

'center the form:

Me.Top = (Screen.Height - Me.Height) / 2

Me.Left = (Screen.Width - Me.Width) / 2

' Connect to the Property database:

Set mobjADOConn = New ADODB.Connection

mobjADOConn.ConnectionString = "DSN=PropDB;Uid=admin;Pwd=;"

mobjADOConn.Open

Call cmdAllData_Click

 

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.

 

'-----------------------------------------------------------------------

------

Private Sub cmdAllData_Click()

'-----------------------------------------------------------------------

------

 

Page 20: Visual Basic 6 (VB6)

On Error GoTo LocalError

Dim lngX As Long

 

'select or reload the data to be displayed:

mstrSQL = "select * from property"

Call OpenNewRecordset

'load data into the text boxes

Call DataLoad

 

' reset the state of the search criteria controls

For lngX = 0 To 2

chkCriteria(lngX).Value = vbUnchecked

Next

Exit Sub

LocalError:

MsgBox Err.Number & " - " & Err.Description

 

End Sub

 

5. Create the user-defined subprocedure OpenNewRecordset.

 

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

Page 21: Visual Basic 6 (VB6)

(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:

 

RecordsetObject.Open Source, ActiveConnection, CursorType, LockType, Options

 

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 (default) Used to open a forward-only cursor. Forward-only cursors

create static snapshots of data. A recordset that uses a forward-

only cursor is not directly updateable and can only be scrolled

from beginning to end (i.e., "MoveNext" is the only "Move" method

that can be used with this type of cursor). Forward-only cursors

offer optimal performance in exchange for feature limitations.

Forward-only cursors are sometimes referred to as firehose

cursors.

adOpenStatic Used to open a static cursor. A static cursor is a static copy of the

data in the data source. Once created, no changes made by other

users propagate to the recordset; the recordset never changes.

Page 22: Visual Basic 6 (VB6)

Note: Client side cursors (like the one used in this sample

application) use only adOpenStatic for CursorTypes regardless of

which CursorType you select.

adOpenDynamic Used to open a dynamic cursor. A dynamic cursor is a "live"

recordset, meaning that any and all additions, changes, and

deletions by other users affect the recordset. Dynamic-cursor

recordsets support all types of navigation, including bookmarks (if

bookmarks are supported by the provider). Dynamic cursors offer

the most features of any cursor type, but at the expense of

increased overhead.

adOpenKeyset Used to open a keyset cursor. Keyset cursors are like dynamic

cursors, except additions made by other users are not visible in

the recordset. The recordset is affected 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 be added, changed, or deleted. This is the locking

method used with static cursors and forward-only cursors.

adLockPessimistic Specifies pessimistic locking. The provider does what is

necessary to ensure successful editing of records, usually by

locking records at the data source immediately upon editing.

adLockOptimistic Specifies optimistic locking. The provider locks records only

when you call the Update method, not when you start editing.

adLockBatchOptimisti

c

Specifies optimistic batch locking. Records are locked in batch

update mode, as opposed to immediate update mode. This

option is required for client-side cursors.

Page 23: Visual Basic 6 (VB6)

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 Indicates that the provider should evaluate CommandText as a

textual definition of a command. This options is used SQL

statements.

adCmdTable Indicates that the provider should evaluate CommandText as a

table.

adCmdStoredProc Indicates that the provider should evaluate CommandText as a

stored procedure.

adCmdUnknown Indicates that the type of command in the CommandText

argument is not known and that the provider should attempt to

interpret it. Typically results in poor performance.

adExecuteAsync Indicates that the command should execute asynchronously.

adFetchAsync Indicates that the remaining rows after the initial quantity specified

in the CacheSize property should be fetched asynchronously.

'-----------------------------------------------------------------------

------

Private Sub OpenNewRecordset()

'-----------------------------------------------------------------------

------

Set mobjADORst = New ADODB.Recordset

mobjADORst.CursorLocation = adUseClient

mobjADORst.Open mstrSQL, mobjADOConn, adOpenStatic, , adCmdText

 

' display current query

txtCurrentQuery.Text = mstrSQL

 

Page 24: Visual Basic 6 (VB6)

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

 

'-----------------------------------------------------------------------

------

Private Sub DataLoad()

'-----------------------------------------------------------------------

------

On Error GoTo LocalError

 

'copy the data from the recordset to the text boxes:

txtPropNo.Text = mobjADORst.Fields("propno")

txtEmpNo.Text = mobjADORst.Fields("empno")

txtAddress.Text = mobjADORst.Fields("address")

txtCity.Text = mobjADORst.Fields("city")

Page 25: Visual Basic 6 (VB6)

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.

 

'-----------------------------------------------------------------------

------

Private Sub SetRecNum()

'-----------------------------------------------------------------------

------

StatusBar1.SimpleText = "row " & mobjADORst.AbsolutePosition _

& " of " & mobjADORst.RecordCount

Page 26: Visual Basic 6 (VB6)

End Sub

 

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

 

'-----------------------------------------------------------------------

------

Private Sub cmdMoveLast_Click()

'-----------------------------------------------------------------------

------

On Error GoTo LocalError

 

mobjADORst.MoveLast

Call DataLoad

Exit Sub

LocalError:

MsgBox Err.Number & " - " & Err.Description

Page 27: Visual Basic 6 (VB6)

End Sub

 

'-----------------------------------------------------------------------

------

Private Sub cmdMoveNext_Click()

'-----------------------------------------------------------------------

------

On Error GoTo LocalError

 

mobjADORst.MoveNext

If mobjADORst.EOF Then

Beep

mobjADORst.MoveLast

End If

Call DataLoad

Exit Sub

LocalError:

MsgBox Err.Number & " - " & Err.Description

End Sub

 

'-----------------------------------------------------------------------

------

Private Sub cmdMovePrevious_Click()

'-----------------------------------------------------------------------

------

On Error GoTo LocalError

 

mobjADORst.MovePrevious

If mobjADORst.BOF Then

Beep

Page 28: Visual Basic 6 (VB6)

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.

 

'-----------------------------------------------------------------------

------

Private Sub chkCriteria_Click(Index As Integer)

'-----------------------------------------------------------------------

------

 

' disable the 'Run Query Now' button

cmdGetData.Enabled = False

 

'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)

Page 29: Visual Basic 6 (VB6)

' 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.

 

'-----------------------------------------------------------------------

------

Private Sub cmdGetData_Click()

'-----------------------------------------------------------------------

------

 

'run the query that the user has created

On Error GoTo LocalError

 

Dim blnFirstOne As Boolean

blnFirstOne = True

mstrSQL = "select * from property where "

If chkCriteria(0).Value = vbChecked Then

If (txtCriteria(0).Text = "") Or (Not IsNumeric(txtCriteria(0).Text))

Then

MsgBox "Employee number is missing or non-numeric. Query not run.", _

vbExclamation, _

Page 30: Visual Basic 6 (VB6)

"ADO Example"

Exit Sub

End If

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

Page 31: Visual Basic 6 (VB6)

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".

 

Download the project files for this sample application here.

 

Page 32: Visual Basic 6 (VB6)

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.

 

Page 33: Visual Basic 6 (VB6)

 

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).

 

Page 34: Visual Basic 6 (VB6)

 

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).

 

Page 35: Visual Basic 6 (VB6)

 

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.

 

Page 36: Visual Basic 6 (VB6)

 

         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.

 

Page 37: Visual Basic 6 (VB6)

 

 

         Create the form shown below. The settings for the various controls are given below.

 

Page 38: Visual Basic 6 (VB6)

 

         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 MaxLength: 3 (allows fractional amount, like 1.5)

txtAsking MaxLength: 0 (not specified)

 

         Set up the Command Buttons as follows:

 

Page 39: Visual Basic 6 (VB6)

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 Sub to center a form on the screen

ValidKey Function to validate a keystroke for use in the KeyPress event of

a textbox

ConvertUpper Function to convert an alphabetic character entered in a textbox

to uppercase, used in the KeyPress event of a textbox

SelectTextBoxText Sub to highlight the text of a textbox when it receives focus.

Used in the GotFocus event of a textbox.

TabToNextTextBox Sub to "autotab" from one textbox to another when maximum

number of characters that can be entered into the first textbox

has been reached.

UnFormatNumber Function to strip out non-numeric characters (dollar signs,

Page 40: Visual Basic 6 (VB6)

commas, etc.) from a formatted number.

 

Option Explicit

 

Public Const gstrNUMERIC_DIGITS As String = "0123456789"

Public Const gstrUPPER_ALPHA_PLUS As String =

"ABCDEFGHIJKLMNOPQRSTUVWXYZ,'-"

 

Public gblnPopulating As Boolean

 

'-----------------------------------------------------------------------

-

Public Sub CenterForm(pobjForm As Form)

'-----------------------------------------------------------------------

-

 

With pobjForm

.Top = (Screen.Height - .Height) / 2

.Left = (Screen.Width - .Width) / 2

End With

 

End Sub

 

'-----------------------------------------------------------------------

-

Public Function ValidKey(pintKeyValue As Integer, _

pstrSearchString As String) As Integer

'-----------------------------------------------------------------------

-

 

Page 41: Visual Basic 6 (VB6)

' Common function to filter out keyboard characters passed to this

' function from KeyPress events.

'

' Typical call:

' KeyAscii = ValidKey(KeyAscii, gstrNUMERIC_DIGITS)

'

 

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

 

'-----------------------------------------------------------------------

-

Public Function ConvertUpper(pintKeyValue As Integer) As Integer

'-----------------------------------------------------------------------

-

 

' Common function to force alphabetic keyboard characters to uppercase

' when called from the KeyPress event.

 

' Typical call:

Page 42: Visual Basic 6 (VB6)

' KeyAscii = ConvertUpper(KeyAscii)

'

 

If Chr$(pintKeyValue) >= "a" And Chr$(pintKeyValue) <= "z" Then

pintKeyValue = pintKeyValue - 32

End If

 

ConvertUpper = pintKeyValue

 

End Function

 

'-----------------------------------------------------------------------

------

Public Sub SelectTextBoxText(pobjTextbox As TextBox)

'-----------------------------------------------------------------------

------

 

With pobjTextbox

.SelStart = 0

.SelLength = Len(.Text)

End With

 

End Sub

 

'-----------------------------------------------------------------------

------

Public Sub TabToNextTextBox(pobjTextBox1 As TextBox, pobjTextBox2 As

TextBox)

'-----------------------------------------------------------------------

------

Page 43: Visual Basic 6 (VB6)

 

If gblnPopulating Then Exit Sub

If pobjTextBox2.Enabled = False Then Exit Sub

If Len(pobjTextBox1.Text) = pobjTextBox1.MaxLength Then

pobjTextBox2.SetFocus

End If

 

End Sub

 

'-----------------------------------------------------------------------

------

Public Function UnFormatNumber(pstrNumberIn As String) As String

'-----------------------------------------------------------------------

------

 

Dim lngX As Long

Dim strCurrChar As String

Dim strNumberOut As String

strNumberOut = ""

For lngX = 1 To Len(pstrNumberIn)

strCurrChar = Mid$(pstrNumberIn, lngX, 1)

If InStr("0123456789.", strCurrChar) > 0 Then

strNumberOut = strNumberOut & strCurrChar

End If

Next

UnFormatNumber = strNumberOut

 

End Function

 

Page 44: Visual Basic 6 (VB6)

         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

 

Dim mobjADOConn As ADODB.Connection

Dim mobjADORst As ADODB.Recordset

Private mstrSQL As String

Private mdblMinAsking As Double

Private mblnUpdatePending As Boolean

Private mstrUpdateType As String

 

Private mavntUSStates As Variant

 

         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).

 

'-----------------------------------------------------------------------

------

Private Sub Form_Load()

Page 45: Visual Basic 6 (VB6)

'-----------------------------------------------------------------------

------

On Error GoTo LocalError

' 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

 

Page 46: Visual Basic 6 (VB6)

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.

 

'-----------------------------------------------------------------------

------

Private Sub GetMinimumAsking()

'-----------------------------------------------------------------------

------

Dim strInputBoxPrompt As String

Dim strAsking As String

 

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

Page 47: Visual Basic 6 (VB6)

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).

 

'-----------------------------------------------------------------------

------

Private Sub GetPropertyData()

'-----------------------------------------------------------------------

------

 

On Error GoTo LocalError

Dim blnGotData As Boolean

blnGotData = False

Do

'select or reload the data to be displayed:

mstrSQL = "select propno" _

& " , empno" _

& " , address" _

& " , city" _

& " , state" _

& " , zip" _

& " , beds" _

& " , baths" _

& " , asking" _

& " from property" _

& " where asking >= " & mdblMinAsking _

& " order by propno"

Set mobjADORst = New ADODB.Recordset

mobjADORst.CursorLocation = adUseClient

Page 48: Visual Basic 6 (VB6)

mobjADORst.Open mstrSQL, mobjADOConn, adOpenDynamic, adLockOptimistic,

adCmdText

If mobjADORst.EOF Then

If MsgBox("There are no properties with an asking price >= " _

& Format$(mdblMinAsking, "Currency") _

& ". Do you want to try again with a different value?", _

vbYesNo + vbQuestion, _

"Asking Price") _

= vbYes Then

GetMinimumAsking

Else

End

End If

Else

blnGotData = True

End If

Loop Until blnGotData

'load data into the text boxes

Call PopulateFormFields

Exit Sub

LocalError:

MsgBox Err.Number & " - " & Err.Description

 

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.

Page 49: Visual Basic 6 (VB6)

 

'-----------------------------------------------------------------------

------

Private Sub PopulateFormFields()

'-----------------------------------------------------------------------

------

On Error GoTo LocalError

 

gblnPopulating = True

 

'copy the data from the resultset to the text boxes:

txtPropNo.Text = mobjADORst.Fields("propno")

txtEmpNo.Text = mobjADORst.Fields("empno")

txtAddress.Text = mobjADORst.Fields("address")

txtCity.Text = mobjADORst.Fields("city")

txtState.Text = mobjADORst.Fields("state")

txtZip.Text = mobjADORst.Fields("zip")

txtBeds.Text = mobjADORst.Fields("beds")

txtBaths.Text = mobjADORst.Fields("baths")

txtAsking.Text = Format$(mobjADORst.Fields("asking"), "Currency")

gblnPopulating = False

 

Call SetRecNum

Exit Sub

LocalError:

MsgBox Err.Number & " - " & Err.Description

 

End Sub

 

Page 50: Visual Basic 6 (VB6)

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.

 

'-----------------------------------------------------------------------

------

Private Sub SetRecNum()

'-----------------------------------------------------------------------

------

StatusBar1.SimpleText = "row " & mobjADORst.AbsolutePosition _

& " of " & mobjADORst.RecordCount

End Sub

 

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.

 

'-----------------------------------------------------------------------

------

Private Sub SetFormState(pblnEnabled As Boolean)

'-----------------------------------------------------------------------

------

 

txtPropNo.Enabled = pblnEnabled

txtEmpNo.Enabled = pblnEnabled

txtAddress.Enabled = pblnEnabled

txtCity.Enabled = pblnEnabled

txtState.Enabled = pblnEnabled

Page 51: Visual Basic 6 (VB6)

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.

 

'-----------------------------------------------------------------------

------

Private Sub Form_Unload(Cancel As Integer)

Page 52: Visual Basic 6 (VB6)

'-----------------------------------------------------------------------

------

 

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.

         Force uppercase on the state textbox.

         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.

 

'-----------------------------------------------------------------------

------

Page 53: Visual Basic 6 (VB6)

' Textbox events

'-----------------------------------------------------------------------

------

 

' 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

Page 54: Visual Basic 6 (VB6)

Private Sub txtAddress_Change()

TabToNextTextBox txtAddress, txtCity

End Sub

 

' city

Private Sub txtCity_GotFocus()

SelectTextBoxText txtCity

End Sub

Private Sub txtCity_Change()

TabToNextTextBox txtCity, txtState

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

Page 55: Visual Basic 6 (VB6)

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

 

Page 56: Visual Basic 6 (VB6)

' asking price

Private Sub txtAsking_GotFocus()

txtAsking.Text = UnFormatNumber(txtAsking.Text)

SelectTextBoxText txtAsking

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

Page 57: Visual Basic 6 (VB6)

End Sub

 

'-----------------------------------------------------------------------

------

Private Sub cmdMoveLast_Click()

'-----------------------------------------------------------------------

------

On Error GoTo LocalError

 

mobjADORst.MoveLast

Call PopulateFormFields

Exit Sub

LocalError:

MsgBox Err.Number & " - " & Err.Description

End Sub

 

'-----------------------------------------------------------------------

------

Private Sub cmdMoveNext_Click()

'-----------------------------------------------------------------------

------

On Error GoTo LocalError

 

mobjADORst.MoveNext

If mobjADORst.EOF Then

Beep

mobjADORst.MoveLast

End If

Call PopulateFormFields

Exit Sub

Page 58: Visual Basic 6 (VB6)

LocalError:

MsgBox Err.Number & " - " & Err.Description

End Sub

 

'-----------------------------------------------------------------------

------

Private Sub cmdMovePrevious_Click()

'-----------------------------------------------------------------------

------

On Error GoTo LocalError

 

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()

Page 59: Visual Basic 6 (VB6)

'-----------------------------------------------------------------------

------

 

On Error GoTo LocalError

 

'clear all the text boxes:

txtPropNo.Text = ""

txtEmpNo.Text = ""

txtAddress.Text = ""

txtCity.Text = ""

txtState.Text = ""

txtZip.Text = ""

txtBeds.Text = ""

txtBaths.Text = ""

txtAsking.Text = ""

SetFormState True

mstrUpdateType = "A"

txtPropNo.SetFocus

Exit Sub

LocalError:

MsgBox Err.Number & " - " & Err.Description

End Sub

 

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.

 

Page 60: Visual Basic 6 (VB6)

'-----------------------------------------------------------------------

------

Private Sub cmdUpdate_Click()

'-----------------------------------------------------------------------

------

 

On Error GoTo LocalError

 

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.)

Page 61: Visual Basic 6 (VB6)

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 row’s 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:

 

RecordsetObject.Find Criteria, SkipRows, SearchDirection, Start

The Criteria argument is a String value that specifies the column name, comparison operator, and

value to use in the search. Only a single-column name may be specified in criteria; multi-

column searches are not supported. The comparison operator may be ">" (greater than),

"<" (less than), "=" (equal), ">=" (greater than or equal), "<=" (less than or equal), "<>"

(not equal), or "like" (pattern matching). The value may be a string, floating-point number,

or date. String values are delimited with single quotes or "#" (number sign) marks (for

example, "state = 'WA'" or "state = #WA#"). Date values are delimited with "#" (number

sign) marks (for example, "start_date > #7/22/97#"). These values can contain hours,

minutes, and seconds to indicate time stamps, but should not contain milliseconds or

errors will occur. If the comparison operator is "like", the string value may contain an

asterisk (*) to find one or more occurrences of any character or substring. For example,

"state like 'M*'" matches Maine and Massachusetts. You can also use leading and trailing

asterisks to find a substring contained within the values. For example, "state like '*as*'"

matches Alaska, Arkansas, and Massachusetts. Asterisks can be used only at the end of

a criteria string, or together at both the beginning and end of a criteria string, as shown

Page 62: Visual Basic 6 (VB6)

above. You cannot use the asterisk as a leading wildcard ('*str'), or embedded wildcard

('s*r'). This will cause an error.

SkipRows is an optional Long value, whose default is zero, that specifies the row offset from the

current row (or bookmark row specified by the Start argument, if present) to begin the

search. By default, the search will start on the current row.

SearchDirection is an optional value that determines in which direction the search is performed.

The value is specified by the constants adSearchForward (the default) or

adSearchBackward, which equate to values of 1 or -1, respectively.

Start is an optional Variant bookmark that functions as the starting position for the search.

Note: Unlike DAO, ADO does not have a "NoMatch" property. If the ADO Find method is

unsuccessful, the record pointer is positioned at the end of the Recordset.

The SetRecNum sub is then be called to display the status bar information about the new record.

The SetFormState sub is then 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.

Note that in the statement that assigns the contents of the txtAsking textbox to the asking field

of the table, our UnFormatNumber function is used to strip off the non-numeric characters. This

is because we are using a display format that includes a dollar sign and commas on the txtAsking

control, and an error would occur if we attempted to assign this directly to the asking field, which

is defined as numeric.

'-----------------------------------------------------------------------

------

Private Sub cmdSave_Click()

'-----------------------------------------------------------------------

------

 

On Error GoTo LocalError

 

Page 63: Visual Basic 6 (VB6)

If Not ValidateAllFields Then Exit Sub

 

If mstrUpdateType = "A" Then

mobjADORst.AddNew

Else

' We can just update the fields. No explicit Edit method

' is available or needed.

End If

'save the data to the database:

mobjADORst.Fields("propno") = txtPropNo.Text

mobjADORst.Fields("empno") = txtEmpNo.Text

mobjADORst.Fields("address") = txtAddress.Text

mobjADORst.Fields("city") = txtCity.Text

mobjADORst.Fields("state") = txtState.Text

mobjADORst.Fields("zip") = txtZip.Text

mobjADORst.Fields("beds") = txtBeds.Text

mobjADORst.Fields("baths") = txtBaths.Text

mobjADORst.Fields("asking") = UnFormatNumber(txtAsking.Text)

mobjADORst.Update

 

If mstrUpdateType = "A" Then

'after the new record is added, the db must be re-queried

'so that the resultset contains the new record:

mobjADORst.Requery

' reposition to the record just added

mobjADORst.Find "propno = " & txtPropNo.Text

'display status info about the new record

SetRecNum

End If

Reset:

Page 64: Visual Basic 6 (VB6)

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.

 

'-----------------------------------------------------------------------

------

Private Sub cmdDelete_Click()

'-----------------------------------------------------------------------

------

 

On Error GoTo LocalError

'when the current record is deleted, the current location in the

recordset

'is invalid. use the Requery method to re-execute the query and update

'the data.

If MsgBox("Are you sure you want to delete this record?", _

vbYesNo + vbQuestion, _

"Delete") = vbNo Then

Exit Sub

Page 65: Visual Basic 6 (VB6)

End If

mobjADORst.Delete

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.

 

'-----------------------------------------------------------------------

------

Private Function ValidateAllFields() As Boolean

'-----------------------------------------------------------------------

------

Page 66: Visual Basic 6 (VB6)

 

ValidateAllFields = False 'guilty until proven innocent

If mstrUpdateType = "A" Then

If txtPropNo.Text = "" Then

MsgBox "Property # must not be blank.", vbExclamation, "Property #"

txtPropNo.SetFocus

Exit Function

ElseIf PropertyExists Then

MsgBox "Property # already exists. Please use a different #.", _

vbExclamation, _

"Property #"

txtPropNo.SetFocus

Exit Function

End If

End If

If txtEmpNo.Text = "" Then

MsgBox "Emp # must not be blank.", vbExclamation, "Emp #"

txtEmpNo.SetFocus

Exit Function

End If

If txtAddress.Text = "" Then

MsgBox "Address must not be blank.", vbExclamation, "Address"

txtAddress.SetFocus

Exit Function

End If

If txtCity.Text = "" Then

MsgBox "City must not be blank.", vbExclamation, "City"

txtCity.SetFocus

Exit Function

End If

Page 67: Visual Basic 6 (VB6)

If Not ValidState Then

MsgBox "Missing or invalid state.", vbExclamation, "State"

txtState.SetFocus

Exit Function

End If

If txtZip.Text = "" Or Len(txtZip.Text) = 5 Then

' it's OK

Else

MsgBox "Zip code must either be blank or exactly 5 digits.", _

vbExclamation, _

"Zip Code"

txtZip.SetFocus

Exit Function

End If

If Val(txtBeds.Text) = 0 Then

MsgBox "Beds must not be zero.", vbExclamation, "Beds"

txtBeds.SetFocus

Exit Function

End If

If Val(txtBaths.Text) = 0 Then

MsgBox "Baths must not be zero.", vbExclamation, "Baths"

txtBaths.SetFocus

Exit Function

End If

If Val(UnFormatNumber(txtAsking.Text)) = 0 Then

MsgBox "Asking must not be zero.", vbExclamation, "Asking"

txtAsking.SetFocus

Exit Function

End If

' if we make it here, all fields have passed edit

Page 68: Visual Basic 6 (VB6)

ValidateAllFields = True

End Function

 

'-----------------------------------------------------------------------

---------

Private Function ValidState() As Boolean

'-----------------------------------------------------------------------

---------

 

Dim lngX As Long

Dim blnStateFound As Boolean

blnStateFound = False

For lngX = 0 To UBound(mavntUSStates)

If txtState.Text = mavntUSStates(lngX) Then

blnStateFound = True

Exit For

End If

Next

ValidState = blnStateFound

End Function

 

'-----------------------------------------------------------------------

------

Private Function PropertyExists() As Boolean

'-----------------------------------------------------------------------

------

 

Dim objTempRst As New ADODB.Recordset

Dim strSQL As String

 

Page 69: Visual Basic 6 (VB6)

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.

 

Page 70: Visual Basic 6 (VB6)

'-----------------------------------------------------------------------

------

Private Sub cmdExit_Click()

'-----------------------------------------------------------------------

------

 

Unload Me

End Sub

 

 

Download the project files for this sample application here.

How did you enjoy this article?:

C

ancel Rating

20

40

60

80

100

Printer Friendly

176943 reads

CommentsThu, 01/21/2010 - 08:50 — Abo Omar (not verified)

Thanks alot

Hi

Thanks alot for fantastic job

If possible, please write about DataReport in visual basic

Good Bye

reply

Page 71: Visual Basic 6 (VB6)

Tue, 01/19/2010 - 03:15 — Nikunj (not verified)

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

reply

Thu, 11/26/2009 - 04:17 — Dins (not verified)

Very Good Tutorialssss .....

a very good tutorial and I am proud as you can provide much inspiration for beginners

and very helpful. I'm from Indonesia pleased with you and your tutorial helped me a lot.

thank you very much.

I am a beginner and could I learn from here to learn more.

Thanks

Didin

reply

Sat, 10/31/2009 - 10:50 — Govind dx (not verified)

Great

Thank you very much....

great......

reply

Fri, 10/09/2009 - 18:16 — NANDAKUMAR PK (not verified)

I really congratulate you

I really congratulate you for writing such a helpful tutorial .

Page 72: Visual Basic 6 (VB6)

reply

Sat, 10/03/2009 - 02:28 — Anonymous (not verified)

help

i always get an error 445 object doesnt support this action which points to the

recodset.update

reply

Fri, 10/02/2009 - 18:19 — Anonymous (not verified)

thank you i understand now

thank you i understand now how ado works.. thank so much for sharing your knowlegde

your tutorial is oso great and its easy to understands.. :D

reply

Tue, 08/04/2009 - 02:24 — Anonymous (not verified)

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?

reply

Mon, 08/03/2009 - 20:47 — Novice_Filipino_Programmer (not verified)

...

Great Tutorial, It helped me a lot thank you very much....

reply

Sun, 08/02/2009 - 01:07 — flash17 (not verified)

HELP!!!

Page 73: Visual Basic 6 (VB6)

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..

reply

Wed, 07/29/2009 - 05:07 — Mohit Kumar (not verified)

Kudos

hey thats a great tutorial...

great work man.....

keep up the good work..

reply

Tue, 07/07/2009 - 20:03 — Vinod Merchant (not verified)

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

reply

Fri, 06/19/2009 - 00:45 — ang sarap ng filling mo (not verified)

please send me this file plz

please send me this file plz so i can debug it on may project

here's my email

[email protected]

reply

Fri, 06/19/2009 - 00:44 — ang sarap ng filling mo (not verified)

Page 74: Visual Basic 6 (VB6)

please send me this file plz

please send me this file plz so i can debug it on may project

here's my email

[email protected]

reply

Sun, 05/10/2009 - 15:42 — Saeed_VB6 (not verified)

GREAT!

Hi

gReAt WeBsItE & GrEaT tUtOrIaL

VB6 Is Still ALIVE

VB6 Is Still Poweful

VB6 Has Still Great Performance

VB6 Is anything you want...

i'm thankful.

reply

Sun, 05/10/2009 - 02:51 — Piyush Vishvas (not verified)

Thanks for easy vb6 training tutorials

I heartily say thanks to you for such a great tutorial on ADO and Databases. It extremely

helped me because you explained it with 3 different examples, which were still all parallel

with each other. When I read them fully and practiced with it, then it was easy to

understand the theory behind these codes. I am so happy that I found your website for

learning vb6 and want to say thank you once again.

reply

Wed, 04/29/2009 - 07:25 — shekar (not verified)

wow..really great article

Page 75: Visual Basic 6 (VB6)

wow..really great article which explains everything about ADO.Thanks a lot buddy.keep

up your good work...

reply

Mon, 04/27/2009 - 06:01 — Anonymous (not verified)

Database?

can anybody please tel me where can i find second database?That is propery Database..I

am not able to find that database.

reply

Wed, 04/22/2009 - 21:54 — Anonymous (not verified)

VB6

Hi, Why visual basic can't recognized the access 2000 file format? Help me pls..

ThankYou!!

reply

Mon, 04/20/2009 - 12:44 — Paddy (not verified)

Very useful tutorial

This is a great tutorial!It helped me to finally understand ADO with databases.Thank you

very much.

reply

Tue, 04/14/2009 - 21:03 — Uday

Thats called

Thats called computerization, have nice and healthy life.

reply

Tue, 04/14/2009 - 19:56 — Anonymous (not verified)

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!!

Page 76: Visual Basic 6 (VB6)

reply

Tue, 04/07/2009 - 02:47 — AQrvin (not verified)

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..

reply

Sat, 03/14/2009 - 10:07 — Pankaj Kumar Sharma (not verified)

best tutorials

i think this is the best tutorial for vb+database on the internet

reply

Wed, 02/18/2009 - 04:37 — Ishan Mathur (not verified)

Great Tutorial

Great Tutorial cum article

Very helpful mostly to students

reply

Page 77: Visual Basic 6 (VB6)

Wed, 02/18/2009 - 01:43 — 03ProgRammeR03 (not verified)

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)

Page 78: Visual Basic 6 (VB6)

'''''''''''''''''''''''''''

please help me..

thankz...

reply

Sun, 02/15/2009 - 04:10 — Ajay (not verified)

Very Nice

Very excellent tutorial ,it helps me lot!

reply

Sat, 01/17/2009 - 09:22 — Shrinivas (not verified)

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!!!!

reply

Fri, 11/28/2008 - 20:53 — Anonymous (not verified)

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

reply

Wed, 11/12/2008 - 02:42 — babyqoh (not verified)

whatta article

Page 79: Visual Basic 6 (VB6)

whatta article

reply

Tue, 10/28/2008 - 05:24 — KIM (not verified)

plzzzz

waw your tutorial so excellent,,but can u help me in my program? how to search a

record?..plzzz tnx

reply

Tue, 10/21/2008 - 01:25 — habd (not verified)

ifihfit is fine keep it up

ifihfit is fine keep it up OkKKKKKKKKKKKKKK!!!!!!!!!!!!!

reply

Thu, 10/16/2008 - 02:14 — YTa (not verified)

Nice and sweet

dcsHay folks this is owsm!!!!! Keep focus and help us to make world better. Thanks!

reply

Sat, 10/11/2008 - 07:56 — Andy Marshall (not verified)

DataSourceName & SQL property fields missing.

This seems like a great tutorial but I'm having problems. I add the ADO Data Control but

the 'DataSourceName' and 'SQL' fields do not appear in the property tab.

If I right-click on the control and select 'ADODC Properties' I can change the field 'Use

ODBC Data Source Name' to 'Biblio' and on the 'RecordSource' tab I can change the

Command Text (SQL) to read 'select * from authors'.

When changing the properties at run-time I need to use different code :

Private Sub cmdIDOrder_Click()

adoBiblio.RecordSource = "select * from authors order by au_id"

Page 80: Visual Basic 6 (VB6)

adoBiblio.Refresh

End Sub

The program runs as expected but I'm concerned about having to use different code.

Does anybody have any ideas?

reply

Wed, 10/08/2008 - 05:40 — Anonymous (not verified)

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. :)

reply

Sun, 10/05/2008 - 01:24 — Deep (not verified)

can any body help me

fdf Hi, I am new to VB6 i did some programing in c++ and java. I am struglling to make

common module from which i can use connection and recordset so that i dont have to

make seperate connection and recorset for each form. we can do that in c++ by making

class. In vb6 i am confused. i was able to make sub in connecting sub in module but i not

able to pass connection object to different forms to create different recordsets. thanks

I

reply

Fri, 10/03/2008 - 23:19 — Akabane (not verified)

how to connect ado with the

how to connect ado with the use of codes or coding.

reply

Thu, 09/17/2009 - 03:59 — joek (not verified)

re:how to connect with ado

hi,

first you have to activate the ado connection by going to

Page 81: Visual Basic 6 (VB6)

project>references>microsoft activex data objects 6.0

then to

components and select the ADO library

next:

declare the connection object

the you declare the recordset .

e.g.

dim conn as new ADODB.Connection

dim rs as new ADODB.Connection

dim strSQL as string

next

in form_load()

event

fill in the following code

conn.open "fill in the source"

strSQL="SELECT * FROM table_name"

rs.open strSQL,conn,adUseClient,AdLockOptimistic 'if using access

the you are through with opening.

reply

Tue, 09/23/2008 - 02:12 — Anonymous (not verified)

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.....

reply

Mon, 09/22/2008 - 11:21 — Anonymous (not verified)

Hi

Excellent Article.... Keep it up

reply

Fri, 09/19/2008 - 02:21 — Grubby (not verified)

Page 82: Visual Basic 6 (VB6)

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~

reply

Mon, 08/25/2008 - 11:01 — christian (not verified)

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.

reply

Fri, 08/22/2008 - 02:50 — nad (not verified)

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

reply

Mon, 07/21/2008 - 09:28 — Shyam (not verified)

good work

keep it up... good work.....

reply

Fri, 07/18/2008 - 21:47 — Tongan Crusader (not verified)

What a marvelous helper

Page 83: Visual Basic 6 (VB6)

You are the one...if anyone is come to give u thanks he is a celever man Remember the

story of leprosy in the bible..only one man return and gave thanks to Jesus...thanks to

those who gave thanks to u...I am thinking of writing a site like this but use it in my

language...I am so happy with you...I know youre blessed with all these good works....

Continue on this good work

The Tongan Crusader

reply

Fri, 07/04/2008 - 23:02 — russel_philippines (not verified)

wow!!!

it helps me a lot to learn ADO database method.. Thanks!

reply

Tue, 07/01/2008 - 06:17 — Jamie Bates (not verified)

You are an asset

**You are an asset to the development community. Please, keep up the great work. You

have just motivated me to start building my sites.

Jamie

reply

Fri, 06/27/2008 - 06:23 — Anonymous (not verified)

This is a great example of

This is a great example of SQL injection.

reply

Wed, 05/21/2008 - 13:27 — Anonymous (not verified)

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.

Page 84: Visual Basic 6 (VB6)

Thank you

Mo

reply

Mon, 04/14/2008 - 22:16 — Anonymous

nice!!!can u add more???with connection in Crystal Report

please add an article with a crystal report connection....

reply

Thu, 02/14/2008 - 01:59 — Anonymous

Cursortypes, locktype, cursorlocation.........

I'm a free lance system developer (programmer) mainly create my program through VB6,

with a little add-ons on different support programs, ei Crystal report etc. I like the review

on the locktypes, cursortypes, and cursorlocations, coz i kinda takeforgranted those basic

option (like the locktype and cursortype, my combination are always, adopendynamic and

adlockoptimistic ) till now im still using such combination, because when i use different

attribute, some of my program malfunction, specially when using the network or via web.

I guess im used to it, and don't give a thing on other options. still it would be a good help

it will improve, specially if i where to used so much memory, object or allocation.

Care for any tips on combination on locktypes and cursortypes?

And most of all, th CURSORLOCATION....... what is the difference between the 2,

aduseclient and aduseserver?

i know they have, but im a little of on finding it.

can you enumerate all or atleast some major factor that give different affect on different

cursorlocation.

thanx

and another:I started on DAO and switch to ADO.

may i ask, which is better, DAO or ADO?

reply

Mon, 01/28/2008 - 02:49 — Anonymous

Database Access With ADO Tutorial

Page 85: Visual Basic 6 (VB6)

Very rich resource. More, please.

reply

Wed, 12/19/2007 - 03:31 — Anonymous

not accepting const

dear all

i tried the sample-3 , given under the tutorial ado samples, as soon as i enter the initial

declaration

"public const mstrnumeric_digits as string ="0123456789" "

it gives me an error

can anyone explain me how to solve it

reply

Wed, 11/28/2007 - 06:32 — Anonymous

Database Access with ADO

I want to compliment you in writing such a great tutorial article on using ADO and

Databases. It was extremely helpful because you displayed 3 different examples, which

were still all parallel with each other. The more that I read through each of the examples

and practiced with it, the clearer I started to understand the theory behind these codes. I

am so glad that I came across your weblink and want to thank you once again.

Respectfully,

Sam Maldonado

reply

Post new comment

Your name:

E-mail:

Page 86: Visual Basic 6 (VB6)

The content of this field is kept private and will not be shown publicly.

Homepage:

Subject:

Comment: *

Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt>

<dd>

Lines and paragraphs break automatically.

You may post block code using <blockcode [type="language"]>...</blockcode> tags. You

may also post inline code using <code [type="language"]>...</code> tags.

More information about formatting options

You might also find these useful: Naming Database Objects

Access SQL

VB6 With Access