To run the code examples shown in the sections that follow, you must set a reference from your Excel
project to the ADO 2.5 Object Library. To do this, bring up the References dialog by selecting the Tools➪
References menu item from within the VBE. Scroll down until you locate the entry labeled Microsoft
ActiveX Data Objects 2.5 Library. Place a check mark beside this entry and click OK (see Figure 20-4).
Figure 20-4
Note that it’s perfectly normal to have multiple versions of the ADO object library available.
Using ADO with Microsoft Access
Because Excel applications that utilize data from Microsoft Access tend to have less complicated data
access requirements than those using SQL Server, Access is used to introduce the basics of ADO.
Connecting to Microsoft Access
ADO connects to Microsoft Access databases through the use of the Microsoft Office 12 Access Database
Engine OLE DB Provider. To connect to a Microsoft Access database, you simply specify this provider in
the ADO connection string and then include any additional provider-specific arguments required. The
following is a summary of the connection string arguments you will most frequently use when connect-
ing to an Access database:
Data Source=[full path and filenameto the Accessdatabase](required)
In this section you’ll utilize the Northwind database. This is a sample database pro-
vided with Microsoft Access 2007. If you don’t have this database available, you will
need to install it to run the example code.
Chapter 20: Data Access with ADO
Pdf rotate one page - rotate PDF page permanently in, ASP.NET, MVC, Ajax, WinForms, WPF
Empower Users to Change the Rotation Angle of PDF File Page Using C#
rotate one page in pdf; save pdf rotate pages
Pdf rotate one page - VB.NET PDF Page Rotate Library: rotate PDF page permanently in, ASP.NET, MVC, Ajax, WinForms, WPF
PDF Document Page Rotation in Visual Basic .NET Class Application
pdf rotate single page reader; pdf reverse page order
Mode=mode(optional)—The three most commonly used settings for this property are:
Opens the database and allows complete shared access to
other users. This is the default setting if the 
argument is not specified.
Opens the database and allows other users read access but
prevents write access.
—Opens the database in exclusive mode, which prevents
any other users from connecting to the database.
User ID=username(optional)—The username to use when connecting to the database. If the
database requires a username and it is not supplied, the connection will fail.
Password=password(optional)—If a password is required to connect to the database, this
argument is used to supply it. Again, the connection will fail if it is required and not supplied,
or is incorrect.
The following example shows a connection string that uses all of these arguments:
Public Const gsCONNECTION As String = _
“Provider= Microsoft.ACE.OLEDB.12.0;” & _
“Data Source=C:\Files\Northwind 2007.accdb;” & _
“Mode=Share Exclusive;” & _
“User ID=Admin;” & _
Retrieving Data from Microsoft Access Using a Plain Text Query
The following procedure demonstrates how to retrieve data from a Microsoft Access database using a
plain text (sometimes referred to as ad hoc) query and place it on an Excel worksheet:
Public Sub PlainTextQuery()
Dim rsData As ADODB.Recordset
Dim sConnect As String
Dim sSQL As String
‘ Create the connection string.
sConnect = “Provider=Microsoft.ACE.OLEDB.12.0;” & _
“Data Source=C:\Files\Northwind 2007.accdb”
‘ Create the SQL Statement.
sSQL = “SELECT Company, [First Name] + ‘ ‘ + [Last Name] “ & _
“FROM Customers “ & _
“WHERE [Country/Region] = ‘USA’ “ & _
“ORDER BY Company;”
‘ Create the Recordset object and run the query.
Set rsData = New ADODB.Recordset
rsData.Open sSQL, sConnect, adOpenForwardOnly, _
adLockReadOnly, adCmdText
‘ Make sure we got records back
Chapter 20: Data Access with ADO
VB.NET PDF Page Delete Library: remove PDF pages in, ASP.
If you are looking for a solution to conveniently delete one page from your PDF document, you can use this VB.NET PDF Library, which supports a variety of PDF
saving rotated pdf pages; how to rotate just one page in pdf
C# PDF File Merge Library: Merge, append PDF files in, ASP.
C# developers can easily merge and append one PDF document to document imaging toolkit, also offers other advanced PDF document page processing and
reverse page order pdf; rotate pdf page and save
If Not rsData.EOF Then
‘ Dump the contents of the recordset onto the worksheet.
Sheet1.Range(“A2”).CopyFromRecordset rsData
‘ Close the Recordset object.
‘ Add headers to the worksheet.
With Sheet1.Range(“A1:B1”)
.Value = Array(“Company”, “Contact Name”)
.Font.Bold = True
End With
‘ Fit the column widths to the data.
‘ Close the Recordset object.
MsgBox “Error: No records returned.”, vbCritical
End If
‘ Destroy the Recordset object.
Set rsData = Nothing
End Sub
There are a number of things to note about this procedure:
The only ADO object used was the Recordsetobject. As mentioned at the beginning of the
ADO section, all of the top-level ADO objects can be created and used independently. If you
were going to perform multiple queries over the course of your application, you would have
created a separate, publicly scoped Connection object to take advantage of ADO’s connection-
pooling feature.
The syntax of the Recordset.Open method has been optimized for maximum performance.
You’ve told the provider what type of command is in the Source argument (adCmdText, a plain
text query), and you’ve opened a forward-only, read-only, server-side cursor (server-side is the
default if the Recordset.CursorLocation property is not specified). This type of cursor is
often referred to as a firehose cursor, because it’s the fastest way to retrieve data from a database.
You do not make any modifications to the destination worksheet until you are sure you have
successfully retrieved data from the database. This avoids having to undo anything if the 
query fails.
You dump the data onto the destination worksheet and close the recordset as quickly as possi-
ble. In most data-access situations, you will be dealing with a multi-user environment, where
multiple users can access the database simultaneously. Getting in and out of the database as
quickly as possible is critical to preventing contention problems, or situations in which two
users attempt to perform mutually incompatible actions on the same piece of data at the same
Note the use of the CopyFromRecordsetmethod of the Excel Range object. This is by far the
fastest method for moving data out of a recordset and onto a worksheet. As you’ll see, it doesn’t
fit every data-access situation, but it’s the method of choice in any situation where its use is pos-
sible. Note that the CopyFromRecordsetmethod does not copy the field names, only data.
Chapter 20: Data Access with ADO
VB.NET PDF File Merge Library: Merge, append PDF files in
all. This guiding page will help you merge two or more PDF documents into a single one in a Visual Basic .NET imaging application.
how to rotate one page in pdf document; how to rotate a single page in a pdf document
C# PDF Page Extract Library: copy, paste, cut PDF pages in
Extract PDF Pages, Copy Pages from One PDF File and Paste into Others in C#.NET Program. Free PDF document processing SDK supports PDF page extraction, copying
rotate pdf page few degrees; rotate individual pages in pdf reader
Retrieving Data from Microsoft Access Using a Stored Query
Microsoft Access allows you to create and store SQL queries in the database. You can retrieve data from
these stored queries just as easily as you can use a plain text SQLstatement. The following procedure
demonstrates this:
Public Sub SavedQuery()
Dim objField As ADODB.Field
Dim rsData As ADODB.Recordset
Dim lOffset As Long
Dim sConnect As String
‘ Create the connection string.
sConnect = “Provider=Microsoft.ACE.OLEDB.12.0;” & _
“Data Source=C:\Files\Northwind 2007.accdb”
‘ Create the Recordset object and run the query.
Set rsData = New ADODB.Recordset
rsData.Open “[Product Sales By Category]”, sConnect, _
adOpenForwardOnly, adLockReadOnly, adCmdTable
‘ Make sure we got records back
If Not rsData.EOF Then
‘ Add headers to the worksheet.
With Sheet1.Range(“A1”)
For Each objField In rsData.Fields
.Offset(0, lOffset).Value = objField.Name
lOffset = lOffset + 1
Next objField
.Resize(1, rsData.Fields.Count).Font.Bold = True
End With
‘ Dump the contents of the recordset onto the worksheet.
Sheet1.Range(“A2”).CopyFromRecordset rsData
‘ Close the Recordset object.
‘ Fit the column widths to the data.
‘ Close the Recordset object.
MsgBox “Error: No records returned.”, vbCritical
End If
‘ Destroy the Recordset object.
Set rsData = Nothing
End Sub
There are two important points to note about this procedure:
Examine the differences between the Recordset.Open method used in this procedure and the
one used in the plain text query. In this case, rather than providing a SQL string, you specified
the name of the stored query you wanted to execute. You also told the provider that the type of
Chapter 20: Data Access with ADO
VB.NET PDF Annotate Library: Draw, edit PDF annotation, markups in
to display it. Thus, PDFPage, derived from REPage, is a programming abstraction for representing one PDF page. Annotating Process.
rotate all pages in pdf and save; rotate pages in pdf and save
C# PDF Page Delete Library: remove PDF pages in, ASP.NET
Using RasterEdge Visual C# .NET PDF page deletion component, developers can easily select one or more PDF pages and delete it/them in both .NET web and Windows
rotate all pages in pdf file; how to rotate all pages in pdf
query being executed was a table query. The Access OLE DB provider treats stored queries and
queries of entire database tables in the same manner.
Because you did not create the SQL statement yourself, you did not know the names of the
fields you were retrieving, or even how many fields there were. Therefore, to create the correct
set of headers for each column in the destination worksheet, you needed to loop the Fields
collection of the Recordset object and determine this information dynamically. To accomplish
this, the recordset had to be open, so you added the fields to the worksheet prior to closing the
Inserting, Updating, and Deleting Records 
with Plain Text SQL in Microsoft Access
Executing plain text INSERTUPDATE, and DELETE statements uses virtually identical methodology.
Therefore, you’ll examine these action queries by inserting a new record, updating that record, and then
deleting it, all within the same procedure. This, of course, is not normally something you would do. You
can take this generic procedure, however, and create a single-purpose insert, update, or delete procedure
by simply removing the sections that you don’t need.
Use the Shippers table from the Northwind database in the next procedure. The first few columns of
this table are shown in Figure 20-5.
Figure 20-5
Notice that the last row in the ID column contains the value (New). This isn’t really a value; rather, it’s a
prompt that alerts you to the fact that values for the ID column are automatically generated by the
Access database. This column is the primary key for the Shippers table, and AutoNumber fields are a
common method used to generate the unique value required for the primary key. You don’t (and can’t)
set or change the value of an AutoNumber field. If you need to maintain a reference to a new record that
you’ve inserted into the table, you’ll need to retrieve the value that was assigned to that record by the
AutoNumber field. You’ll see how this is done in the example that follows:
Public Sub InsertUpdateDelete()
Dim objCommand As ADODB.Command
Dim rsData As ADODB.Recordset
Dim lRecordsAffected As Long
Dim lKey As Long
Chapter 20: Data Access with ADO
C# PDF: C# Code to Process PDF Document Page Using C#.NET PDF
for developers on how to rotate PDF page in different two different PDF documents into one large PDF C# PDF Page Processing: Split PDF Document - C#.NET PDF
how to rotate pdf pages and save; reverse page order pdf online
C# PDF copy, paste image Library: copy, paste, cut PDF images in
This C#.NET example describes how to copy an image from one page of PDF document and paste it into another page. // Define input and output documents.
pdf rotate page; rotate pages in pdf permanently
Dim sConnect As String
On Error GoTo ErrorHandler
‘ Create the connection string.
sConnect = “Provider=Microsoft.ACE.OLEDB.12.0;” & _
“Data Source=C:\Files\Northwind 2007.accdb;” & _
“Mode=Share Exclusive”
‘ Create the Command object we’ll use for all three queries.
Set objCommand = New ADODB.Command
objCommand.ActiveConnection = sConnect
‘’’’’ INSERT a new record into the database ‘’’’’’’’’’’’’’’’’’’
‘ Load the SQL string into the Command object.
objCommand.CommandText = “INSERT INTO Shippers” & _
“(Company, [Business Phone]) “ & _
“VALUES(‘Air Carriers’, ‘(205) 555-1212’);”
‘ Execute the SQL statement.
objCommand.Execute RecordsAffected:=lRecordsAffected, _
Options:=adCmdText Or adExecuteNoRecords
‘ Check for errors. Only one record should have been affected.
If lRecordsAffected <> 1 Then Err.Raise _
Number:=vbObjectError + 1024, _
Description:=”Error executing INSERT statement.”
‘ Retrieve the primary key generated for our new record.
objCommand.CommandText = “SELECT @@IDENTITY;”
Set rsData = objCommand.Execute(Options:=adCmdText)
‘ Check for errors. The recordset should contain data.
If rsData.EOF Then Err.Raise _
Number:=vbObjectError + 1024, _
Description:=”Error retrieving primary key value.”
‘ Store the primary key value for later use.
lKey = rsData.Fields(0).Value
‘’’’’ UPDATE the record we just created ‘’’’’’’’’’’’’’’’’’’
‘ Load the SQL string into the Command object.
objCommand.CommandText = “UPDATE Shippers “ & _
“SET [Business Phone]=’(206) 546-0086’ “ & _
“WHERE ID=” & CStr(lKey) & “;”
‘ Execute the SQL statement.
objCommand.Execute RecordsAffected:=lRecordsAffected, _
Options:=adCmdText Or adExecuteNoRecords
‘ Check for errors. Only one record should have been affected.
If lRecordsAffected <> 1 Then Err.Raise _
Number:=vbObjectError + 1024, _
Description:=”Error executing UPDATE statement.”
‘’’’’ DELETE our record from the database ‘’’’’’’’’’’’’’’’’’’
‘ Load the SQL string into the Command object.
objCommand.CommandText = “DELETE FROM Shippers “ & _
“WHERE ID = “ & CStr(lKey) & “;”
‘ Execute the SQL statement.
objCommand.Execute RecordsAffected:=lRecordsAffected, _
Chapter 20: Data Access with ADO
Options:=adCmdText Or adExecuteNoRecords
‘ Check for errors. Only one record should have been affected.
If lRecordsAffected <> 1 Then Err.Raise _
Number:=vbObjectError + 1024, _
Description:=”Error executing DELETE statement.”
‘ Destroy our ADO objects.
Set objCommand = Nothing
Set rsData = Nothing
Exit Sub
MsgBox Err.Description, vbCritical
Resume ErrorExit
End Sub
Quickly review what you’ve done in this procedure. First you inserted a new record into the Shippers
table. Then you retrieved the primary key that had been assigned to that new record by the database
(more on this in a moment). Next you used the primary key of your new record to locate it and modify
the telephone number in its BusinessPhone field. Finally, you used the primary key of the record to
locate it and delete it from the database.
Important things to note about this procedure:
You used the same ADO Command object throughout the procedure. All that was required to
execute different commands was to load new SQL statements into the Command.CommandText
The process of preparing and executing the command and then checking for errors upon com-
pletion was identical for all three types of action query.
After inserting a new record in the first part of the procedure, you needed to retrieve the pri-
mary key value that had been assigned to that record by the ID AutoNumber field. You did this
by querying the value of the @@IDENTITYsystem variable. This is a variable maintained by 
the Access database that holds the value of the most recently assigned AutoNumber field. In
most cases, you must be sure to query this value immediately after performing the insert. The
@@IDENTITYvariable is a database-wide variable, so your primary key value will be overwrit-
ten if any other user performs a similar insert before you query it. You prevented the possibility
of this occurring in this example by opening the database in exclusive mode (note the Mode
argument in the connection string).
Using ADO with Microsoft SQL Server
The previous section on Microsoft Access covered the basics of performing the various types of queries
in ADO. Because ADO is designed to present a common gateway to different data sources, there isn’t a
lot of difference in these basic operations whether your database is in Access or in SQL Server. Therefore,
after a brief introduction to the few important differences that arise when using ADO with SQL Server,
this section covers more advanced topics, including stored procedures, multiple recordsets, and discon-
nected recordsets.
Chapter 20: Data Access with ADO
Connecting to Microsoft SQL Server
To connect to a Microsoft SQL Server database, you simply specify the OLE DB provider for SQL Server
in the ADO connection string, and then include any additional provider-specific arguments required.
The following is a summary of the connection string arguments you will most frequently use when con-
necting to a SQL Server database:
Data Source=server name;—This will typically be the NetBIOS name of the computer that
SQL Server is installed on. If SQL Server is installed as a named instance, the server name will
have the following syntax: NetBIOSName\SQLServerInstanceName.
Initial Catalog=database name;—Unlike Access, one instance of SQLServer can contain
many databases. This argument will contain the name of the database you want to connect to.
User ID=username;—The username for SQLServer authentication.
Password=password;—The password for SQLServer authentication.
Network Library=netlib;—By default, the SQLServer OLE DB provider will attempt to use
named pipes network protocol to connect to SQL Server. This is required for using Windows inte-
grated security (explained later). There are many instances, however, where it is not possible to
use named pipes. These include accessing SQL Server from a Windows 9x operating system and
accessing SQL Server over the Internet. In these cases, the preferred protocol for connecting to
SQL Server is TCP/IP. This can be specified on each machine by using the SQL Server Client
Network Utility, or you can simply use the Network Library connection string argument to
specify the name of the TCP/IP network library, which is dbmssocn.
IntegratedSecurity=SSPI;—This connection string argument specifies that you want to
use Windows integrated security rather than SQL Server authentication. The UserID and
Passwordarguments will be ignored if this argument is present.
ANote About SQL Server Security
SQL Server can be set to use three types of security: SQL Server authentication,
Windows integrated security, and mixed mode. SQL Server authentication means
that separate user accounts must be added to SQL Server, and each user must supply
a SQL Server username and password to connect.
This type of security is most commonly used when SQL Server must be accessed
from outside the network. With Windows integrated security, SQL Server recognizes
the same usernames and passwords that are used to log in to the Windows network.
Mixed mode simply means you can use either one of the two.
The examples in this section use the SQL Server version of the Northwind sample
database. This database is similar to the Access 2007 version of Northwind used pre-
viously, but there will be some differences in the names and data types of various
Chapter 20: Data Access with ADO
Following are examples of two different SQL Server connection strings. The first example shows a con-
nection string that uses SQL Server authentication and the TCP/IP connection protocol. The second
example shows a connection string that uses Windows integrated security:
Public Const gsCONNECTION As String = _
“Provider=SQLOLEDB;” & _
“Data Source=ComputerName\SQLServerName;” & _
“Initial Catalog=Northwind;” & _
“User ID=User;Password=password;” & _
“Network Library=dbmssocn”
Public Const gsCONNECTION As String = _
“Provider=SQLOLEDB;” & _
“Data Source=ComputerName\SQLServerName;” & _
“Initial Catalog=Northwind;” & _
“Integrated Security=SSPI”
Microsoft SQL Server Stored Procedures
The syntax for executing plain text (or ad hoc) queries against SQLServer is identical to that which you
used in the example for Access. The only difference is the contents of the connection string. When pro-
gramming with SQL Server, however, it is more common to call SQL Server stored procedures. 
Stored procedures are simply precompiled SQL statements that can be accessed by name from the
database. They are much like VBA procedures in that they can accept arguments and return values. An
example of a simple stored procedure that queries the Customers table is shown here:
CREATE PROC spGetCustomerNames
@Country  nvarchar(24)
SELECT    CustomerID,
FROM      Customers
WHERE     Country = @Country
ORDER BY  CompanyName
This stored procedure takes one argument, @Country, and returns a recordset containing the values for
the fields specified in the SELECT list for customers whose country matches the value passed to the
ADO provides a very quick and simple way to execute stored procedures using the Connection object.
ADO treats all stored procedures in the currently connected database as dynamic methods of the
Connectionobject. You can call a stored procedure exactly like any other Connectionobject method,
passing any arguments to the stored procedure as method arguments, and optionally passing a
Recordsetobject as the last argument if the stored procedure returns a recordset.
This method is best used for “one-off” procedures rather than those you will execute multiple times,
because it isn’t the most efficient method. However, it is significantly easier to code. The following
example demonstrates executing the previous stored procedure as a method of the Connection object:
Chapter 20: Data Access with ADO
Public Sub ExecuteStoredProcAsMethod()
Dim objConn As ADODB.Connection
Dim rsData As ADODB.Recordset
Dim sConnect As String
‘ Create the connection string.
sConnect = “Provider=SQLOLEDB;Data Source=P2800\P2800;” & _
“Initial Catalog=Northwind;Integrated Security=SSPI”
‘ Create the Connection and Recordset objects.
Set objConn = New ADODB.Connection
Set rsData = New ADODB.Recordset
‘ Open the connection and execute the stored procedure.
objConn.Open sConnect
objConn.spGetCustomerNames “UK”, rsData
‘ Make sure we got records back
If Not rsData.EOF Then
‘ Dump the contents of the recordset onto the worksheet.
Sheet1.Range(“A1”).CopyFromRecordset rsData
‘ Close the recordset
‘ Fit the column widths to the data.
MsgBox “Error: No records returned.”, vbCritical
End If
‘ Clean up our ADO objects.
If CBool(objConn.State And adStateOpen) Then objConn.Close
Set objConn = Nothing
Set rsData = Nothing
End Sub
In this procedure, you executed the spGetCustomerNames stored procedure and passed it the value
“UK”for its @Countryargument. This populated the rsDatarecordset with all of the customers located
in the UK. Note that the Connectionobject must be opened before the dynamic methods are populated,
and that you must instantiate the Recordsetobject prior to passing it as an argument.
The most efficient way to handle stored procedures that will be executed multiple times is to prepare 
a publicly scoped Command object to represent them. The Connection will be stored in the Command
object’s ActiveConnection property, the stored procedure’s name will be stored in the Command
object’s CommandText property, and any arguments to the stored procedure will be used to populate 
the Command object’s Parameters collection.
Once this Command object has been created, it can be executed as many times as you like over the course
of your application, without incurring the overhead required to perform the tasks just described with
each execution.
Chapter 20: Data Access with ADO
Documents you may be interested
Documents you may be interested