Visual Basic 6 and Ado
Visual Basic 6 and Ado
Navigate To
Home Tutorials Source Code Samples Add Your Tutorial VB.NET Tutorials Forums Articles External Links Advertise Here! Contact Us
Guides
o o
Beginner Guide Controls Guide Database Guide Introduction to SQL Using Data Control
o o o o o o
Using DAO Code Using RDO Using ADO ADO and ListView ADO stored procs Using Crystal Reports
Navigation
Create content
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.
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 select * from authors Now put three text boxes on the form, and set their Name, DataSource, and DataField properties as follows:
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:
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:
A number that uniquely identifies the p the Primary Key (although it is not defi A number that identifies the real estate system, this would be the foreign key t table (such a table is not present in the
The street address of the property. The city where the property is located. The state where the property is located The zip code where the property is loc The descriptive name of the neighborh Age in years of the home. (A better tab be the date in which the property was 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 ( indicating 2 bathrooms i.e. 2 full b FOOTAGE Number (Long Integer) The footage of the property. ASKING Number (Long Integer) Asking price of the property in whole d BID Number (Long Integer) Bid amount of the potential buyer in wh SALEPRICE Number (Long Integer) Sale price (amount the property actual 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.
Text (20) Text (15) Text (2) Text (5) Text (15) Number (Long Integer)
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.
The text box in the middle of the form has the following properties:
Name MultiLine Locked The command buttons have the following properties:
The check boxes are an array: Name chkCriteria(0) chkCriteria(1) chkCriteria(2) The labels are also an array: Name lblCriteria(0) lblCriteria(1) lblCriteria(2) The textboxes are also an array: Name txtCriteria(0) txtCriteria(1) txtCriteria(2) Caption EmpNo City State Caption = Like Like Caption EmpNo City State
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, theConnectionString 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.
'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.
'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
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 clientside 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 adOpenForwardOnly
Description (default) Used to open a forward-only cursor. Forward-only cursors create static only cursor is not directly updateable and can only be scrolled from beginning to
that can be used with this type of cursor). Forward-only cursors offer optimal pe 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 da users propagate to the recordset; the recordset never changes. Note: Client sid application) use only adOpenStatic for CursorTypes regardless of which Cursor adOpenDynamic Used to open a dynamic cursor. A dynamic cursor is a "live" recordset, meaning by other users affect the recordset. Dynamic-cursor recordsets support all types are supported by the provider). Dynamic cursors offer the most features of any overhead. adOpenKeyset Used to open a keyset cursor. Keyset cursors are like dynamic cursors, except 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:
Description (default) Specifies read-only locking. Records can be read, but data cannot be method used with static cursors and forward-only cursors. adLockPessimistic Specifies pessimistic locking. The provider does what is necessary to ensure s records at the data source immediately upon editing. adLockOptimistic Specifies optimistic locking. The provider locks records only when you call the adLockBatchOptimistic Specifies optimistic batch locking. Records are locked in batch update mode, a required for client-side cursors. 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 adLockReadOnly
Description Indicates that the provider should evaluate CommandText as a textual definitio statements. adCmdTable Indicates that the provider should evaluate CommandText as a table. adCmdStoredProc Indicates that the provider should evaluate CommandText as a stored procedu adCmdUnknown Indicates that the type of command in the CommandText argument is not know 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 Cach '---------------------------------------------------------------------adCmdText ------Private Sub OpenNewRecordset() '---------------------------------------------------------------------------Set mobjADORst = New ADODB.Recordset mobjADORst.CursorLocation = adUseClient mobjADORst.Open mstrSQL, mobjADOConn, adOpenStatic, , adCmdText
Value
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":
'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")
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 andRecordCount 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 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.
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.
'----------------------------------------------------------------------------
'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, _ "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 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 txtPropNo txtEmpNo txtAddress txtCity txtState txtZip txtBeds txtBaths txtAsking
Properties MaxLength: 5 MaxLength: 4 MaxLength: 20 MaxLength: 15 MaxLength: 2 MaxLength: 5 MaxLength: 1 MaxLength: 3 (allows fractional amount, like 1.5) MaxLength: 0 (not specified)
cmdCancel cmdExit
Cancel 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:
Sub to center a form on the screen Function to validate a keystroke for use in the KeyPress event of a textbox Function to convert an alphabetic character entered in a textbox to uppercase Sub to highlight the text of a textbox when it receives focus. Used in the GotF Sub to "autotab" from one textbox to another when maximum number of char has been reached. Function to strip out non-numeric characters (dollar signs, commas, etc.) from
Public Const gstrNUMERIC_DIGITS As String = "0123456789" Public Const gstrUPPER_ALPHA_PLUS As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ,'-"
With pobjForm .Top = (Screen.Height - .Height) / 2 .Left = (Screen.Width - .Width) / 2 End With
End Sub
' 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
' Common function to force alphabetic keyboard characters to uppercase ' when called from the KeyPress event.
If Chr$(pintKeyValue) >= "a" And Chr$(pintKeyValue) <= "z" Then pintKeyValue = pintKeyValue - 32 End If
ConvertUpper = pintKeyValue
End Function
End Sub
'----------------------------------------------------------------------------
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
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
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
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).
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 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.
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")
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 theAbsolutePosition 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.
'----------------------------------------------------------------------------
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. 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.
' 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()
' 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 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
' 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 End 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
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() '----------------------------------------------------------------------------
'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.
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 theValidateAllFields 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 anEdit 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:
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 incriteria; multicolumn 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*'" matchesMaine and Massachusetts. You can also use leading and trailing asterisks to find a substring contained within the values. For example, "state like '*as*'" matchesAlaska, 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 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) oradSearchBackward, 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.
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: 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.
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 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.
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 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 ValidateAllFields = True End Function
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
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.
Similar links
Naming Database Objects Access SQL
VB6 With Access Oracle and Visual Basic using ADO Database Access with RDO (Remote Data Objects) Using Crystal Reports Database Access with the Data Control Using ADO and the ListView control Creating PDF files in Visual Basic VB6 Animated Charts (With FusionCharts) 430873 reads
hehe
thank you so much .. it is so helping ty
reply
reply
reply
Hello Every1, I m a student of a private University in Bangladesh. I m using windows xp. i installed the SQL server 2000. But i can't get connected with Data source ODBC... Can anybody help me or refer me to know Sql Server 2000 installation process and how to connect Data source ODBC. PLease help..
reply
reply
thanhk so much!!!!! :)
thanhk so much!!!!! :)
reply
reply
thank u guys!
thank u guys!
reply
reply
Exteremely Good
The Tutorial is exteremely good and useful.
reply
reply
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.),
reply
reply
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...
reply
reply
run time error 3709 The connection cannot be used to perform this operation. It is either closed or invalid in this context. Vb debugger stop this statement " mobjADORst.Open mstrSQL, , adOpenStatic, , adCmdText " Could you help me this error? Thanks,
reply
reply
Sorry! I missed
Sorry! I missed activeconnection argument.
reply
reply
reply
reply
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
reply
reply
thank you!
thank you!
reply
help
can you teach me how to get and save data using visual basic 6 that is connected in a database (ms access 2007)
reply
reply
reply
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
reply
reply
reply
reply
reply
thanks
that's a very fascinating work using ADO!please email me your form please for me to learn more. thank you again!
reply
reply
reply
reply
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.
reply
about vb notes
ss hellow...........sir, i like vb 6.0 programing lg. also this notes have helpsus for everyone vb programer.
reply
reply
Thank u..
This is the best tutorial ...,thank you very much
reply
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.
reply
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
reply
reply
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
reply
Sun, 02/28/2010 - 10:34 Kumar Kartik Chandra Prasad Mahato (not verified)
Wonderful...............
what a tutorial.............
reply
reply
reply
Thanks alot
Hi Thanks alot for fantastic job If possible, please write about DataReport in visual basic Good Bye
reply
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...
reply
reply
reply
Great
Thank you very much.... great......
reply
reply
help
i always get an error 445 object doesnt support this action which points to the recodset.update
reply
reply
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
...
reply
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..
reply
Kudos
hey thats a great tutorial... great work man..... keep up the good work..
reply
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
please send me this file plz so i can debug it on may project here's my email [email protected]
reply
reply
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
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.......
reply
reply
reply
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
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!
reply
VB6
Hi, Why visual basic can't recognized the access 2000 file format? Help me pls.. ThankYou!!
reply
reply
next
last
E-mail:
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.
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