Microsoft SQL Server 2005 Developer’s Guide- P14

Microsoft SQL Server 2005 Developer’s Guide- P14:This book is the successor to the SQL Server 2000 Developer’s Guide, which
was extremely successful thanks to all of the supportive SQL Server developers
who bought that edition of the book. Our first thanks go to all of the people
who encouraged us to write another book about Microsoft’s incredible new relational
database server: SQL Server 2005.

Nội dung Text: Microsoft SQL Server 2005 Developer’s Guide- P14

Chapter 8: Developing Database Applications with ADO 259
delivered as part of the SQL Server 2000 client components. ADO was delivered as
part of the Visual Basic 6.0 and the older pre- .NET Visual Studio Enterprise Edition,
which included Visual Basic 6.0 and Visual C++ 6.0. ADO has since been succeeded by
ADO.NET and Visual Studio 2005, which you can read about in Chapter 7. However,
there are still many COM-based ADO applications written in Visual Basic 6.0 that
connect to SQL Server.
As you saw in Figure 8-2, OLE DB provides two distinctly different methods for
accessing SQL Server data: the OLE DB for SQL Server provider and the OLE DB
provider for ODBC. ADO can work with both of these OLE DB providers. ADO takes
advantage of a multilevel architecture that insulates the applications using the ADO
object framework from the underlying network protocols and topology. Figure 8-3
illustrates the relationship of ADO, OLE DB, ODBC, and the PCs networking support.
At the top of the figure, you can see the Visual Basic ADO application. The
Visual Basic application creates and uses the various ADO objects. The ADO object
framework makes calls to the appropriate OLE DB provider. If the ADO application
is using the OLE DB provider for ODBC, then the MSDASQL OLE DB provider
will be used. If the ADO application is using the OLE DB for SQL Server provider,
then the SQLOLEDB provider will be used. When using the OLE DB provider for
ODBC, ADO loads the msdasql.dll file, which, in turn, loads the ODBC Driver
Manager. The OLE DB provider for ODBC maps the OLE DB calls made by ADO
into ODBC calls, which are passed on to the ODBC Driver Manager.
Figure 8-3 ADO Network architecture

260 M i c r o s o f t S Q L S e r v e r 2 0 0 5 D e v e l o p e r ’s G u i d e
The ODBC Driver Manager handles loading the appropriate ODBC driver. The
ODBC driver typically uses a network interprocess communication (IPC) method
like Named Pipes, TCP/IP Sockets, or SPX to communicate to a remote IPC
server that provides access to the target database. The native OLE DB provider for
SQL Server doesn’t use any additional middle layers. When using the OLE DB
provider for SQL Server, ADO loads sqloledb.dll, which directly loads and uses
the appropriate network IPC method to communicate with the database. The IPC
client component establishes a communications link with the corresponding server
IPC through the networking protocol in use. The network protocol is responsible
for sending and receiving the IPC data stream over the network. The most common
network protocol is TCP/IP. Finally, at the bottom of this stack is the physical
network topology. The physical network includes the adapter cards and cabling that
make the actual connections between the networked systems. Ethernet is the most
common network topology.
OLE DB and ADO Files
Here is a summary of the client files used to implement ADO:
File Description
msdasql.dll OLE DB Provider for ODBC
Sqloledb.dll OLE DB Provider for SQL Server
msado15.dll ADO Object Library
ADO Architecture
As with several of the other data access object models, ADO is implemented using
a hierarchical object framework. However, the ADO object model is simpler and
flatter than Microsoft’s previous data access object libraries, such as Data Access
Objects (DAO) or Remote Database Objects (RDO) frameworks. In Figure 8-4, you
can see an overview of ADO’s object hierarchy.
The Connection, Recordset, and Command objects are the three primary objects
in the ADO object model. The Connection object represents a connection to the
remote data source. In addition to establishing the connection to a data source,

Chapter 8: Developing Database Applications with ADO 261
ADO Application
Connection
Errors
Error
Command
Parameters
Parameter
Recordset
Fields
Field
Record
Fields
Field
Stream
Figure 8-4 ADO object hierarchy
Connection objects can also be used to control the transaction scope. A Connection
object can be associated with either a Recordset object or a Command object.
The Recordset object represents a result set returned from the data source. An
ADO Recordset object can either use an open Connection object or establish its
own connection to the target data source. Recordset objects let you both query and
modify data. Each Recordset object contains a collection of Field objects, where
each Field object represents a column of data in the Recordset.
The Command object is used to issue commands and parameterized SQL statements.
Command objects can be used to call stored procedures and execute SQL action
statements, as well as SQL queries that return recordsets. Like the ADO Recordset
object, the Command object can either use an active Connection object or establish
its own connection to the target data source. The Command object contains a Parameters

262 M i c r o s o f t S Q L S e r v e r 2 0 0 5 D e v e l o p e r ’s G u i d e
collection, where each Parameter object in the collection represents a parameter the
Command object uses. In the case where a Command object executes a parameterized
SQL statement, each Parameter object would represent one of the parameters in the
SQL statement.
Directly beneath the Connection object is the Errors collection. Each Error object
contained in the Errors collection contains information about an error encountered
by one of the objects in the ADO object framework.
In addition to the main objects shown in Figure 8-4, the Connection, Command,
Recordset, and Field objects all have a Properties collection, which consists of a set
of Property objects. Each Property object can be used to get or set the various properties
associated with the object.
While the Connection, Command, and Recordset objects are the most commonly
used objects in the ADO object framework, ADO also includes Record and Stream
objects. The Record object can be used to represent a single record in a Recordset,
or it can represent hierarchical tree-structured namespaces. The Record object can
be used to represent hierarchically structured entities like folders and files in a file
system, or directories and messages in an e-mail system. The Stream object is used
to read or write stream-oriented data such as XML documents or binary objects.
While at first glance, the ADO framework may seem as hierarchically structured
as DAO and RDO, that’s not really the case. Unlike the older data access object
frameworks that ADO essentially replaces, all the primary ADO objects (for example,
Connection, Command, and Recordset) can be created on their own without needing
to be accessed through a higher-level object. This makes the ADO object framework
much flatter and more flexible than the other object models. For instance, the ADO
object framework allows a Recordset object to be opened and accessed without first
requiring an instance of the Connection object. The capability to use each object
directly without first instantiating any higher-order objects tends to make ADO a bit
simpler to work with than the other object frameworks. As you see in some of the
code examples, however, ADO isn’t always as straightforward in use as the other
frameworks.
An Overview of Using ADO
ADO is built as a COM automation server, which makes accessing ADO functions
from Visual Basic easier. Unlike when using ODBC or other DLL-based APIs,
where you must manually declare their functions and parameters in a .bas or .cls
module, with ADO you only need to add the ADO reference to your project, as
explained in the next section. After adding the ADO reference to your Visual Basic

Chapter 8: Developing Database Applications with ADO 263
development environment, you can readily use all the ADO objects. A summary of
the steps required to use ADO from Visual Basic follows:
1. Make a reference in Visual Basic to the Microsoft ADO 2.8 object library.
2. Open a connection using the Connection, Command, or Recordset object.
3. Use the Command or Recordset object to access data.
4. Close the connection to the Connection, Command, or Recordset object.
Adding the ADO Reference to Visual Basic
Before you can use ADO from Visual Basic, you must set a reference to the ADO
object library, also known as the ADO automation server. The files that provide the
basic support for ADO 2.8 are installed on the system when you first download the
ADO support from the Microsoft Web site or when you install one of the products
containing ADO listed previously, in the section “ADO (ActiveX Data Objects).”
Before you can begin using ADO in your Visual Basic projects, however, you need
to set a reference to the ADO COM object library in Visual Basic’s development
environment. To add a reference to the ADO Objects 2.8 Library in Visual Basic 6,
start Visual Basic, and then select Project | References to display the References
dialog box shown in Figure 8-5.
Figure 8-5 Setting a reference to the ADO Object Library

Chapter 8: Developing Database Applications with ADO 265
before you establish a connection to a data source. Using ADO, the first action
your application takes is to open a connection using the Connection, Command, or
Recordset object.
Connecting to SQL Server
ADO can connect to SQL Server using either the MSDASQL OLE DB provider
for ODBC or the SQLOLEDB OLE DB provider for SQL Server. The MSDASQL
provider allows the ADO object framework to be used with existing ODBC drivers,
while the SQLOLEDB OLE DB provider connects directly to SQL Server. Both of
these OLE DB providers can be used with the ADO Connection, Command, and
Recordset objects. In the following section, you see how to establish a connection with
SQL Server using both the OLE DB provider for ODBC and the OLE DB provider for
SQL Server. You also see how to connect to SQL Server using the ADO Connection
object, as well as making a connection directly using ADO Recordset object.
Opening a Connection with the OLE DB Provider for ODBC
If you’re familiar with the DAO or RDO object frameworks, using the ADO
Connection object with the OLE DB provider for ODBC to establish a connection
to a SQL Server system is probably the most familiar starting point for beginning to
build an ADO application. Like DAO and RDO, the MSDASQL OLE DB provider
for ODBC uses an ODBC driver to access SQL Server. This means either the system
running the application must have an existing ODBC driver for SQL Server and
a Data Source Name (DSN) for SQL Server in the ODBC Administrator, or the
application must use a DSN-less connection string.
The following code illustrates how to use the ADO Connection object and the
MSDASQL provider to prompt the user to select an existing DSN that will be used
to connect to SQL Server:
Private Sub Connect(sLoginID As String, sPassword As String)
Dim cn As New ADODB.Connection
' DSN Connection using the OLE DB provider for ODBC – MSDASQL
cn.ConnectionString = "DSN=" & _
";DATABASE=AdventureWorks;UID=" & sLoginID & _
";PWD=" & sPassword
' Prompt the user to select the DSN
cn.Properties("Prompt") = adPromptComplete
cn.Open
cn.Close
End Sub

266 M i c r o s o f t S Q L S e r v e r 2 0 0 5 D e v e l o p e r ’s G u i d e
In the beginning of this code example, you can see where a new instance of the
ADO Connection object named cn is created. Because ADO objects don’t rely on
upper-level objects, each object must generally have a Dim statement that uses Visual
Basic’s New keyword. Or, you could use late-binding and create the object at run
time using the CreateObject statement. Next, the ConnectionString property of the cn
Connection object is assigned an ODBC connection string. Like the normal ODBC
connection string, the connection string used in the ADO ConnectionString property
must contain a set of predefined keywords where each keyword and its associated
value are separated from the other keywords and their values by semicolons.
Because ADO is based on OLE DB rather than just ODBC, the keywords used in
the connection string are a bit different than the keywords used in a standard ODBC
connection string. Table 8-1 presents the ADO connection string keywords supported
for all OLE DB providers.
TIP
While this example uses uppercase to present the OLE DB connection string keywords, that isn’t
a requirement. The keywords aren’t case-sensitive.
In addition to the generic OLE DB connection string keywords, each OLE DB
provider also supports provider-specific connection string keywords. In the case of
the OLE DB Provider for ODBC, the provider passes on any non-ADO connection
Keyword Description
PROVIDER This optional keyword can be used to identify the name of the OLE DB provider to be
used. If no provider name is supplied, the connection uses the MSDASQL provider.
DATASOURCE or The name of an existing SQL Server instance.
SERVER
DATABASE or The SQL Server target database name.
INITIAL CATALOG
USER ID or The login ID for the data source (used for SQL Server authentication).
UID
PASSWORD or The password associated with the login ID (used for SQL Server authentication).
PWD
OLE DB Services Used to disable specific OLE DB services. The value of –1 is the default that indicates
all services are enabled; –2 disables connection pooling; –4 disables connection
pooling and auto-enlistment; –5 disables client cursors; –6 disables pooling, auto-
enlistment, and client cursors; 0 disables all services.
Table 8-1 Common ADO Connection String Keywords

Chapter 8: Developing Database Applications with ADO 267
parameters to the ODBC driver manager, which uses them with the target ODBC
driver. Table 8-2 lists the connection string keywords supported by MSDASQL,
provider for the Microsoft SQL Server ODBC driver. The most common keywords
are presented at the top of the list, and the lesser-used keywords follow in alphabetical
order.
Keyword Description
DSN The name of an existing data source created using the ODBC Administrator.
FILEDSN The name of an existing file data source created using the ODBC Administrator.
DRIVER The name of an existing ODBC driver.
SERVER The name of an existing SQL Server system.
SAVEFILE The name of a file data source that contains the saved connection information.
ADDRESS The network address of the SQL Server system.
ANSINPW Uses a value of YES or NO, where YES specifies that ANSI-defined behaviors are to be used
for handling NULLs.
APP Specifies the name of the client application.
ATTACHDBFILENAME Specifies the name of an attachable database. The path to the data file must be included
(for example, c:\ mssql\Mydatabase.mdf). If the database was detached, it automatically
becomes attached after the connection completes and the database then becomes the
default database for the connection.
AUTOTRANSLATE Uses a value of TRUE or FALSE, where FALSE prevents automatic ANSI/multibyte character
conversions. The default value of TRUE automatically converts the values transfer between
SQL server and the client.
FALLBACK Uses a value of YES or NO, where YES specifies the ODBC driver should attempt to connect
to the fallback server specified by an earlier SQLSetConnectAttr ODBC function call (SQL
Server 6.5 only).
LANGUAGE Specifies the SQL Server language name to be used for this connection.
NETWORK Specifies the network library DLL to be used. The value used by this keyword should not
include the path of the .dll file extension.
QUERYLOGFILE Specifies the full path of the file used to store query logs.
QUERYLOG_ON Uses a value of YES or NO, where YES specifies that long-running queries are to be logged
to the query log file specified by the QUERYLOGFILE keyword.
QUOTEDID Uses a value of YES or NO, where YES specifies that Quoted Identifiers will be set on for
the connection.
Table 8-2 OLE DB Provider for ODBC Provider-Specific Keywords for SQL Server

268 M i c r o s o f t S Q L S e r v e r 2 0 0 5 D e v e l o p e r ’s G u i d e
Keyword Description
REGIONAL Uses a value of YES or NO, where YES specifies SQL Server uses client settings when
converting date, time, currency, and data.
STATSLOGFILE Specifies the full path of the file used to store ODBC driver performance statistics.
STATSLOG_ON Uses a value of YES or NO, where YES specifies ODBC driver statistics are to be logged to
the stats log file specified by the STATSLOGFILE keyword.
TRUSTED_CONNECTION Uses a value of YES or NO, where a value of YES indicates Windows NT authentication is to
be used and a value of NO indicates mixed or SQL Server authentication is to be used.
USEPROCFORPREPARE Uses a value of YES or NO to indicate whether SQL Server should create temporary stored
procedures for each prepared command (SQL Server 6.5 only).
WSID Identifies the client workstation.
Table 8-2 OLE DB Provider for ODBC Provider-Specific Keywords for SQL Server
(Continued)
After the OLE DB connection string is assigned to the Connection object’s
ConnectionString property, the Connection object’s Prompt property is assigned
the constant value of adPromptComplete. This value specifies the ODBC Driver
Manager should prompt for any required connection information that’s not supplied
in the connection string.
TIP
The Properties collection of the ADO Connection, Command, and Recordset objects lets you get and
set property values using named items in the Properties collection. In fact, some ADO properties
like the Prompt property aren’t exposed directly through the object framework and can only be
accessed through the Properties collection. While this dynamic Properties collection gives the ADO
object model more flexibility than DAO or RDO, it also hides properties, making it more difficult
to find and work with properties than the more straightforward DAO or RDO object models. If you
can’t find an ADO property you think should exist, try searching for it by iterating through the
Properties collection.
The Prompt property controls how the ODBC Driver Manager responds to the
keyword and values contained in the connection string. Table 8-3 lists the valid
values for the Prompt property.
In this example, the connection string doesn’t use the PROVIDER keyword,
so the OLE DB provider for ODBC—MSDASQL—is used by default. This
means the connection to SQL Server takes place via an ODBC driver. In addition,
the connection string doesn’t specify a value for the DSN keyword. This means

Chapter 8: Developing Database Applications with ADO 269
Constant Description
adPromptNever The ODBC Driver Manager can only use the information provided by the
connection string to make a connection. If sufficient information is not supplied,
the connection fails.
adPromptAlways The ODBC Driver Manager always displays the ODBC Administrator to prompt for
connection information.
adPromptComplete The ODBC driver determines if all the required connection information has been
supplied in the connection string. If all the required information is present,
the connection is made without further prompting. If any of the required
information is missing, the ODBC Administrator prompts the user for the missing
information.
adPromptCompleteRequired This option behaves like adPromptComplete, except any prompts containing
information that has already been supplied are disabled.
Table 8-3 ADO MSDASQL Prompt Constants
either the connection string must use the DRIVER keyword to make a DSN-less
connection or the ODBC Driver Manager must prompt the user for the DSN to make
a connection to SQL Server. In this example, the DRIVER keyword isn’t used and
the value of adPromptComplete is specified in the Prompt property. This allows the
ODBC Driver Manager to prompt the user to select an existing ODBC data source.
After the user has responded to the ODBC Driver Manager prompt, the cn
Connection object’s Open method connects to SQL Server. The Connection object’s
Open method takes three optional parameters:
The ﬁrst optional parameter accepts a string that contains an OLE DB connection
string. This parameter performs exactly the same function as the Connection
object’s ConnectionString property, and you can use this parameter as an
alternative to setting the ConnectionString property.
The second optional parameter accepts a String variable that contains a valid
login ID for the target data source.
The third optional parameter accepts a String variable that can contain the
password for the target data source.
TIP
While both OLE DB connection strings and the second and third parameters of the Open method
let you specify login information, don’t use both at the same time. Because you normally need to
use the OLE DB connection string to supply the name of the OLE DB provide anyway, supplying the
login information as a part of the OLE DB connection string is usually simpler.

270 M i c r o s o f t S Q L S e r v e r 2 0 0 5 D e v e l o p e r ’s G u i d e
In this example, there’s no other processing, so the Close method ends the
connection.
Opening a DSN-less Connection with the OLE DB Provider for ODBC
The previous example illustrated how to establish a SQL Server connection using the
MSDASQL provider and an existing DSN. Instances occur when your application
may need to make an ODBC-based connection, however, without being able to rely
on a DSN being preconfigured. Luckily, the MSDASQL OLE DB provider also
supports using DSN-less connections. Using a DSN-less connection removes the
requirement for an existing data source.
The following code illustrates how to use the ADO Connection object and the
MSDASQL provider to make a DSN-less connection to SQL Server:
Private Sub DSNlessConnect _
(sServer As String, sLoginID As String, sPassword As String)
Dim cn As New ADODB.Connection
' DSNless Connection using the OLE DB provider for ODBC – MSDASSQL
cn.ConnectionString = "DRIVER=SQL Server" & _
";SERVER=" & sServer & _
";UID=" & sLoginID & _
";PWD=" & sPassword & _
";DATABASE=AdventureWorks"
cn.Open
cn.Close
End Sub
Creating a new ADO Connection object named cn is the first action that
takes place in this code example. Next, the ConnectionString property of the cn
Connection object is assigned a connection string. As you might expect, because
this connection string is intended to establish a DSN-less connection, it’s quite a bit
different than the connection string presented in the preceding example. Because the
PROVIDER keyword isn’t used, the MSDASQL provider for ODBC is used as the
default. As you might guess, the DSN keyword isn’t needed to establish a DSN-less
connection. Instead, the DRIVER keyword has the value of “SQL Server” to indicate
the SQL Server ODBC driver should be used.
NOTE
Optionally, the value used by the DRIVER keyword can be enclosed in {}, as in {SQL Server}, but
this isn’t a requirement.

Chapter 8: Developing Database Applications with ADO 271
In addition to specifying the ODBC driver to be used, a DSN-less ODBC connection
string must also indicate the server and database to be used. These values are supplied
by the SERVER and DATABASE keywords. Finally, the UID and PWD keywords,
described in Table 8-1, supply the required SQL Server login information.
After setting the ConnectionString property with a DSN-less ODBC connection
string, the Connection object’s Open method starts a connection to the SQL Server
system. Then the Connection object’s Close method ends the connection.
Opening a Connection with the OLE DB Provider for SQL Server
The OLE DB provider for ODBC is primarily intended to enable ADO applications
to access ODBC-compliant databases when no native OLE DB provider is
available. While ODBC is certainly the established database access standard and
is supported by virtually all popular databases, that’s not the case with OLE DB,
which is a newer technology. The SQL Server 2000 OLE DB provider is supplied
in sqloledb.dll.
Using the OLE DB provider for SQL Server is similar to using the OLE DB
provider for ODBC. Because the OLE DB provider for SQL Server doesn’t use
ODBC, there’s no requirement for using a data source or an existing ODBC driver.
However, you do need to specify the name of the OLE DB provider.
The following example illustrates how to make a connection to SQL Server using
the ADO Connection object and the OLE DB provider for SQL Server:
Private Sub SQLOLEDBConnect _
(sServer As String, sLoginID As String, sPassword As String)
Dim cn As New ADODB.Connection
' Connect using the OLE DB provider for SQL Server – SQLOLEDB
cn.ConnectionString = "PROVIDER=SQLOLEDB" & _
";SERVER=" & sServer & _
";UID=" & sLoginID & _
";PWD=" & sPassword & _
";DATABASE=AdventureWorks"
cn.Open
cn.Close
End Sub
As in the previous examples, an instance of the ADO Connection object is created.
Then the ConnectionString property of the ADO Connection object is assigned an

272 M i c r o s o f t S Q L S e r v e r 2 0 0 5 D e v e l o p e r ’s G u i d e
OLE DB connection string. This connection string uses the PROVIDER keyword to
specify the SQLOLEDB provider is used. Specifying the PROVIDER keyword is
required to use the OLE DB provider for SQL Server. If you omit this keyword, the
provider defaults to the value of MSDASQL (the OLE DB provider for ODBC). In
addition, the SERVER and DATABASE keywords are also required. The SERVER
keyword specifies the name of the SQL Server system that will be connected to, and
the DATABASE keyword identifies the database to be used. The UID and PWD
keywords provide the authentication values required to log in to SQL Server if you
are connecting using mixed security. If you are connecting using NT Authentication,
the UID and PWD keywords are ignored, as the login will use your Windows NT user
name and password. Table 8-4 lists all the provider-specific keywords provided by
Microsoft’s OLE DB Provider for SQL Server.
TIP
As the preceding listing demonstrates, you can freely mix the provider-specific connection string
keywords with the generic OLE DB connection string keywords in the connection string.
Keyword Description
TRUSTED_CONNECTION Uses a value of YES or NO to indicate where a value of YES indicates
Windows NT authentication is to be used and a value of NO indicates mixed
or SQL Server authentication should be used.
CURRENT LANGUAGE Specifies the SQL Server language name to be used for this connection.
NETWORK ADDRESS Specifies the SQL Server network address.
NETWORK LIBRARY Specifies the network library DLL to be used. The value used by this
keyword should not include the path of the .dll file extension.
USE PROCEDURE FOR PREPARE Uses a value of YES or NO to indicate whether SQL Server should create
temporary stored procedures for each prepared command.
AUTO TRANSLATE Uses a value of TRUE or FALSE, where FALSE prevents automatic ANSI/
multibyte character conversions. The default value of TRUE automatically
converts the data transferred between the SQL server and the client.
PACKET SIZE Used to alter the network packet size. Accepts values from 512 to 32767.
If no value is specified, a default packet size of 4096 is used.
APPLICATION NAME Identifies the current application.
WORKSTATION ID Identifies the client workstation.
Table 8-4 Connection String Keyword for the OLE DB Provider for SQL Server

Chapter 8: Developing Database Applications with ADO 273
After setting the ConnectionString property, the Open method starts the connection.
Once the connection has been established, other database access can be performed.
In this example, there’s no additional work, so the connection is closed using the
Close method.
TIP
If you are connecting to a named instance of SQL Server 2005, you need to use the named
instance name in conjunction with the SERVER keyword. For instance, to connect to a named
instance other than the default instance, you would use the following format with the SERVER
keyword: SERVER=computername\instancename. And to connect to the instance named TestServer
on the computer named teca4, for example, you would use the following form of the SERVER
keyword: SERVER=teca4\TestServer.
Opening a Trusted Connection using the OLE DB Provider for SQL Server
The preceding example illustrated how to establish a SQL Server connection using the
SQLOLEDB Provider and SQL Server Security (aka mixed security). However, using
NT Security, also known as Integrated Security, provides for a more secure connection
because the same values used for the client’s Windows login are also used for SQL
Server authentication—there’s no need to specify the user ID or the password from
the application. In addition, Integrated Security can make administration easier by
eliminating the need to create a set of SQL Server login IDs that are separate from the
Windows NT/2000 User IDs. The following example illustrates how to make a trusted
connection to SQL Server using the ADO Connection object and the OLE DB provider
for SQL Server:
Private Sub SQLOLEDBTrustedConnect _
(sServer As String, sLoginID As String, sPassword As String, _
bIntegratedSecurity As Boolean)
Dim cn As New ADODB.Connection
' Connect using the SQLOLEDB provider
cn.ConnectionString = "PROVIDER=SQLOLEDB" & _
";SERVER=" & sServer & _
";DATABASE=AdventureWorks"
' Use the Trusted_Connection keyword for integrated security
If bIntegratedSecurity = True Then
cn.ConnectionString = cn.ConnectionString _
& ";TRUSTED_CONNECTION=YES"
Else
' Otherwise supply the LoginID and Password
cn.ConnectionString = cn.ConnectionString & ";UID=" _

274 M i c r o s o f t S Q L S e r v e r 2 0 0 5 D e v e l o p e r ’s G u i d e
& sLoginID & ";PWD=" & sPassword
End If
cn.Open
cn.Close
End Sub
In the beginning of this subroutine, you can see where the server name, login
ID, and password are passed in the subroutine as String values. In addition, the
bIntegratedSecurity Boolean variable is used to indicate whether the SQL Server
connection should be made using Integrated Security or SQL Server Security.
A value of True indicates Integrated Security is to be used, while a value of False
indicates the connection will use SQL Server Security.
Next, an instance of the ADO Connection object is created and the
ConnectionString property is assigned. As in the previous example, the connection
string uses the PROVIDER keyword to specify the SQLOLEDB provider, and the
DATABASE keyword should set AdventureWorks as the default database.
Then the bIntegratedSecurity variable is tested for a value of True. If the
bIntegratedSecurity variable is true, then Integrated Security is be used and the
TRUSTED_CONNECTION=YES keyword is appended to the connection string.
Otherwise, SQL Server Security is to be used, and the UID and PWD keywords are
used to provide the SQL Server authentication information.
After the ConnectionString has been set up, the ADO Connection object’s Open
method is used to connect to SQL Server. In this example, after the connection
has been established, it is immediately closed using the Connection object’s Close
method.
Open a Connection Using the Connection Object’s Properties
All the previous examples have illustrated connecting to SQL Server using values
supplied via the Connection object’s ConnectionString property. While providing
server and database connection information is certainly a requirement to establish
an ADO connection to SQL Server, using the ConnectionString property is not. You
can also provide all the required connection information using the ADO Connection
object’s Extended Properties. Unlike standard ADO object properties that can be
viewed using the Object Browser, Extended Properties access provider-specific
information that isn’t explicitly available in the standard ADO Connection object.
The following example illustrates how to set up a SQL Server connection using the
ADO Connection object’s extended properties:
Private Sub SQLOLEDBPropertiesConnect _
(sServer As String, sLoginID As String, sPassword As String, _
bIntegratedSecurity As Boolean)

Chapter 8: Developing Database Applications with ADO 275
Dim cn As New ADODB.Connection
' Specify the OLE DB provider
cn.Provider = "sqloledb"
' Set the extended connection properties
cn.Properties("Data Source").Value = sServer
cn.Properties("Initial Catalog").Value = "AdventureWorks"
' Check for Integrated security
If bIntegratedSecurity = True Then
cn.Properties("Integrated Security").Value = "SSPI"
Else
cn.Properties("User ID").Value = sLoginID
cn.Properties("Password").Value = sPassword
End If
cn.Open
cn.Close
End Sub
String variables containing the server name, login ID, and password are passed
in to the beginning of this subroutine, followed by the bIntegratedSecurity Boolean
variable, which indicates whether Integrated Security will be used. Like the previous
example, a value of True indicates Integrated Security is to be used, while a value of
False indicates the connection will use SQL Server security.
Next, an instance of the ADO Connection object is created and its Provider
property is set to sqloledb, the name of the SQL Server OLE DB provider. After
the Provider property is set, then the specific connection values are assigned to the
Connection object’s Extended Properties. Each Extended Property is located in the
Properties collection by using its name. For instance, the Data Source property is
identified using the “Data Source” string, and its value is set to the name of the SQL
Server instance to which the application intends to connect. Next the Initial Catalog
property is assigned the name of the AdventureWorks database, which causes
AdventureWorks to be used as the default database.
TIP
While you can’t see the available extended properties using the Object Browser, you can see
them in the Debugger by adding an instance of the Connection object to the Watch List, and then
expanding the Properties collection. Each Extended Property is listed as Item n (where n uniquely
numbers each property). And as you might expect, the Name property contains the Extended
Properties’ name, while the Value property contains its value.

276 M i c r o s o f t S Q L S e r v e r 2 0 0 5 D e v e l o p e r ’s G u i d e
Then the bIntegratedSecurity variable is tested for a value of True. If the
bIntegratedSecurity variable is True, then the Integrated Security property is set
to a value of Security Support Provider Interface (SSPI), to specify Windows NT
Authentication. Otherwise, the User ID and Password connection properties are
assigned values and SQL Server Security is used for the connection authentication.
After the Connection object’s Extended Properties have been assigned connection
values, the Open method is used to connect to SQL Server. The connection is then
closed using the Connection object’s Close method.
Connecting to SQL Server Using a UDL File
A Universal Data Link (UDL) file is the OLE DB equivalent to an ODBC File DSN.
Like an ODBC File DSN, a UDL file stores OLE DB connection information, such
as the provider, server, database username, password, and other connection options
you can use to establish an ADO connection. One of the advantages to using a UDL
file is that an administrator or developer can centrally create the UDL file, which
can then be distributed to all networked clients along with the application. From
an application developer’s standpoint, using a UDL file to connect to SQL Server
is similar to using the standard OLE DB connection string. The following example
illustrates how you can use an existing UDL file to connect to SQL Server.
Private Sub SQLOLEDBUDLConnect()
Dim cn As New ADODB.Connection
' Connect using the OLE DB Provider for SQL Server – SQLOLEDB
cn.ConnectionString = "FILE NAME=" & App.Path & \\udlSample.udl
cn.Open
cn.Close
End Sub
First an instance of the ADO Connection object is created, and then the
ConnectionString property of the Connection object is assigned a string consisting
of the FILE NAME= keyword, followed by the path and name of the UDL that
contains the SQL Server connection information. In this example, the udlsample.udl
file is located in the same directory as the VB database application. If the application
were located in the c:\DBApp directory, the resolved connection string would then
appear as follows:
"FILE NAME=C:\DBApp\udlsample.udl"
After the Connection object’s ConnectionString property has been assigned the
FILE NAME keyword and the path to the existing UDL, the Open method is used to

Chapter 8: Developing Database Applications with ADO 277
connect to SQL Server. The connection is then closed using the Connection object’s
Close method.
Connecting to SQL Server Using the Data Link Dialog
Just as it’s possible to cause the ODBC driver to prompt the user for any required
connection parameters at run time, it’s also possible to prompt for the required OLE
DB connection values at run time. However, nothing that’s inherently a part of either
OLE DB or ADO lets you prompt for the connection attributes. Instead, OLE DB
connection properties are captured at run time using the DataLink dialog, which is
a part of the OLE DB Service object.
Adding a Reference to the OLE DB Service Object Before you can use the Data Link
dialog box from your Visual Basic application, you must add a reference to the
Microsoft OLE DB Service Component 1.0 Type Library, as well as a reference to
the Microsoft ActiveX Data Objects 2.8 Library. To add a reference to Visual Basic,
select the References option from Visual Basic’s Project menu. The References
dialog box shown in Figure 8-7 is then displayed.
When the References dialog box is first displayed, scroll through the list of
references until you see the Microsoft OLE DB Service 1.0 Type Library.
Figure 8-7 Adding the OLE DB Service Component Type Library

278 M i c r o s o f t S Q L S e r v e r 2 0 0 5 D e v e l o p e r ’s G u i d e
Figure 8-8 Viewing the DataLink object in the Object Browser
Clicking the check box immediately in front of the name, and then clicking the OK
button adds a reference to the OLE DB Service Library to the current VB project.
After a reference to the OLE DB Service Library has been added to your project, you
can use Visual Basic’s Object Browser to view the object’s properties and methods,
as shown in Figure 8-8.
After a reference to the OLE DB Service Component 1.0 Type Library is added to
VB, you can then create an instance of the Data Link object in your application that
displays the OLE DB connection prompts to the end user. The following code listing
shows the code to display the Data Link dialog box:
Private Sub SQLOLEDBPromptConnect(cn As ADODB.Connection)
Dim dl As New MSDASC.DataLinks
' Display the Data Link Dialog
Set cn = dl.PromptNew
On Error Resume Next