1. Trang chủ
  2. » Công Nghệ Thông Tin

Microsoft SQL Server 2005 Developer’s Guide- P16 ppsx

20 241 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 20
Dung lượng 345,12 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Using Prepared SQL and the ADO Command Object The capability to use prepared SQL statements and parameter markers is one of the features that enables ADO to be used in developing high-pe

Trang 1

Private Sub BookMarkFind(cn As ADODB.Connection, _

rs As ADODB.Recordset, oBookMark As Variant)

With rs

.CursorLocation = adUseClient

.Open "Select * from Sales.SpecialOffer Order By SpecialOfferID", cn

End With

' Find Mountain Tire Sale and set a bookmark

rs.Find "Description = 'Mountain Tire Sale'", , adSearchForward

oBookMark = rs.Bookmark

' Find Volume Discount over 60, display the remainder of the resultset

rs.Find "Description = 'Volume Discount over 60'", , adSearchBackward

DisplayForwardGrid rs, hflxResults

End Sub

In the beginning of the BookmarkFind subroutine, you can see where instances

of the ADO Connection and Recordset objects are passed into the subroutine In

addition, a Variant variable named oBookMark is used to pass back the bookmark to

be set inside this routine

Next, a With statement is used to assign values to properties of the rs Recordset

object Using a value of adUseClient indicates the Recordset will be maintained

on the client system rather than on the SQL Server system Using a local cursor

typically provides much better performance for processing small and medium result

sets consisting of a few hundred records Then the Open method is used along

with a SQL select statement that retrieves all the rows and columns from the Sales

SpecialOffer table and orders them by SpecialOfferID

After the Open method has completed, the rs Recordset object will be populated and

the Find method can then be used to locate specific records within the Recordset In

this code listing, the Find method is used twice The first instance of the Find method

is used to locate the first row in the Recordset where the Description column contains

the value of Mountain Tire Sale The first parameter of the Find method takes the

search argument, which uses the same type of search criteria used in a typical Where

clause The ADO Find method search criteria can use a single field name with one

comparison operator and a literal value to use in the search The search parameter

supports using equal, not equal, greater than, less than, and Like operators The second

parameter of the Find method isn’t used in this example, but optionally, it indicates

the number of records to skip before attempting to find the desired record The third

parameter indicates the direction of the search The value of adSearchForward causes

the search to move forward from the current pointer position, while the value of

Trang 2

adSearchBackward causes the search to go backward from the current position in the Recordset If the Find isn’t successful, the EOF indicator will be set to True in the rs Recordset object Likewise, if the pointer is at the end of the Recordset and another Find is executed, it will fail unless you reposition the pointer in the Recordset After the row containing the value of Mountain Tire Sale is located using the Find method, then the Bookmark property of that row is assigned to the oBookmark variable to allow that row to be located easily later

Next, the Find method is used a second time to locate the row in the Recordset object where the Description column contained the value of Volume Discount over

60 In this case, because Volume Discount over 60 occurs before Mountain Tire Sale in the Recordset set object, the adSearchBackward flag is used to search the Recordset object in reverse order After the pointer is positioned in the Recordset object to Volume Discount over 60, the DisplayForwardGrid subroutine is called

to display the remaining contents of the Recordset object The results of the Find method are shown in Figure 8-14

Figure 8-14 Using the Recordset object’s Find method

Trang 3

After a bookmark has been saved, you can then use that saved bookmark

to position the pointer quickly to the bookmarked row in the Recordset In the

previous code listing, the bookmark value of the row where the Description column

contained the value of Mountain Tire Sale was saved in the Variant variable named

oBookmark In the next listing, you can see how to use that saved bookmark value to

reposition the pointer in the Recordset

Private Sub BookMarkJump(cn As ADODB.Connection, _

rs As ADODB.Recordset, oBookMark As Variant)

' Jump to previous bookmark and display the result set

rs.Bookmark = oBookMark

DisplayForwardGrid rs, hflxResults

End Sub

In the BookMarkJump subroutine shown in this listing, you can see where instances

of the ADO Connection and Recordset objects are passed into the subroutine, followed

by the oBookMark Variant variable In this example, the oBookMark variable contains

the value of the bookmark that was saved in the earlier listing This means it contains

a value that uniquely identifies the row in the Recordset that contains the value of

Mountain Tire Sale

Assigning the rsBookMark property with the saved bookmark value immediately

repositions the pointer in the Recordset to the bookmarked row Next, the

DisplayForwardGrid subroutine is used to display the contents of the Recordset,

beginning with the value of Mountain Tire Sale You can see the results of using the

bookmark in Figure 8-15

Using Prepared SQL and the ADO Command Object

The capability to use prepared SQL statements and parameter markers is one of

the features that enables ADO to be used in developing high-performance database

applications Using prepared statements in your database applications is one of those

small changes that can result in big performance gains Dynamic SQL statements

must be parsed and a data access plan must be created each time the Dynamic SQL

statement is executed—even if exactly the same statement is reused

Although dynamic SQL works well for ad hoc queries, it isn’t the best for executing

the type of repetitive SQL statements that make up online transaction processing

(OLTP)–type applications Prepared SQL, or static SQL, as it’s sometimes called, is

better suited to OLTP applications where a high degree of SQL statement reuse occurs

With prepared SQL, the SQL statement is parsed and the creation of the data access

Trang 4

plan is only performed once Subsequent calls using the prepared statements are fast because the compiled data access plan is already in place

TIP

For prepared SQL statements, SQL Server 2005 creates data access plans in the procedure cache The procedure cache is a part of SQL Server’s buffer cache, which is an area of working memory used by SQL Server Although data access plans stored in the procedure cache are shared by all users, each user has a separate execution context In addition, the access plans created for ad hoc SQL statement queries can also be stored in SQL Server procedure cache However, they are stored only if the cost to execute the plan exceeds a certain internal threshold, and they are reused only under “safe” conditions Unlike when using prepared SQL statements, you can’t rely on the data access plans created for these dynamic SQL statements being maintained in the procedure cache.

The following code example shows how to create an ADO query that uses a prepared SQL statement:

Figure 8-15 Using an ADO Recordset bookmark

Trang 5

Private Sub CommandPS(cn As ADODB.Connection)

Dim cmd As New ADODB.Command

Dim rs As New ADODB.Recordset

With cmd

.ActiveConnection = cn

' Set up the SQL statement

.CommandText = "Select * From Sales.SalesOrderDetail" _

& "Where SalesOrderID = ?"

' Add the parameter (optional)

.CreateParameter , adInteger, adParamInput, 4

'Set the parameter value

.Parameters(0).Value = 43695

End With

'Set up the input parameter

Set rs = cmd.Execute

DisplayForwardGrid rs, Grid

rs.Close

Set rs = Nothing

End Sub

In the beginning of this subroutine, a new ADO Command object name cmd is

created, along with an ADO Recordset object named rs The Command object is

used to create and execute the prepared SQL statement, while the Recordset object

is used to hold the returned result set

Next, the Visual Basic With block works with a group of the Command object’s

properties The first line of code in the With block sets the Command object’s

ActiveConnection property to the name of an active ADO Connection object named

cn Then the CommandText property is assigned a string containing the SQL statement

to be executed This SQL statement returns all columns in the Sales.SalesOrderDetail

table where the value of the SalesOrderID column equals a value to be supplied at

run time The question mark (?) is a parameter marker Each replaceable parameter

must be indicated using a question mark This example SQL statement uses a single

parameter in the Where clause, so only one parameter marker is needed Next, the

CreateParameter method defines the attribute of the parameter

The CreateParameter statement accepts four parameters The first optional

parameter accepts a string that can be used to give the parameter a name The second

parameter accepts a Long variable, which identifies the data type to be used with the

parameter In the preceding example, the value of adInteger indicates the parameter

Trang 6

will contain character data The following table lists the ADO data type constants and matches them with their corresponding SQL Server data types:

The third parameter of the CreateParameter statement specifies whether the parameter is to be used as input, output, or both The value of adParamInput shows this is an input-only parameter Table 8-8 lists the allowable values for this parameter

Trang 7

The fourth parameter specifies the length of the parameter In the preceding

example, a value of 4 indicates the parameter is four bytes long

After the parameter characteristics have been specified, the value 43695 is placed

into the Value property of the first (and in this case, only) Parameter object in the

Parameters collection Parameters(0) corresponds to the ? parameter marker used in

the SQL Select statement Assigning 43695 to the Parameter object’s Value property

essentially causes the SQL statement to be evaluated as

Select * From Sales.SalesOrderDetail Where SalesOrderID = 43695

Next, the Command object’s Execute method runs the Select statement on SQL

Server Because this SQL Select statement returns a result set, the output of the

cmd object is assigned to an ADO Recordset object The rs Recordset object is then

passed into the DisplayForwardGrid subroutine, which displays the contents of the

Recordset object Finally, the Recordset object is closed using the Close method You

can see the results of the prepared SQL statement code in Figure 8-16

If this Command object were executed only a single time, there would be no

performance benefits over simply using the ADO Recordset object to execute the

query Executing this Command object multiple times, however, results in improved

performance because the SQL statement and access plan have already been prepared

To execute a Command object multiple times, you would simply assign a new value

to the Parameter object’s Value property, and then rerun the Command object’s

Execute method

Executing Dynamic SQL with the ADO Connection Object

ADO can also be used to execute dynamic SQL statements on the remote database

Dynamic SQL can be used for a variety of both data management and data

ADO Direction Constant Description

adParamInput The parameter is input-only

adParamOutput The parameter is an output parameter

adParamInputOutput The parameter is to be used for both input and output

adParamReturnValue The parameter contains the return value from a stored procedure

This is typically only used with the first parameter (Parameters(0))

Table 8-8 ADO Parameter Direction Constants

Trang 8

manipulation tasks The following example illustrates how you can create a table named Sales.SalesDepartment in the AdventureWorks database:

Private Sub CreateTable(cn As ADODB.Connection)

Dim sSQL As String

On Error Resume Next

'Make certain that the table is created by dropping the table ' If the table doesn’t exist the code will move on to the

' next statement

sSQL = "Drop Table Sales.SalesDepartment"

cn.Execute sSQL

'Reset the error handler and create the table

' If an error is encountered it will be displayed

On Error GoTo ErrorHandler

sSQL = "Create Table Sales.SalesDepartment " _

& "(Dep_ID Char(4) Not Null, Dep_Name Char(25), " _

& "Primary Key(Dep_ID))"

Figure 8-16 Using Prepared SQL and the ADO Command object

Trang 9

cn.Execute sSQL

Exit Sub

ErrorHandler:

DisplayADOError

End Sub

This CreateTable subroutine actually performs two separate SQL action queries

The first statement deletes a table, and the second statement re-creates the table The

SQL Drop statement ensures the table doesn’t exist prior to running the SQL Create

statement

Near the beginning of the subroutine, Visual Basic’s On Error statement enables

error handling for this subroutine In this first instance, the error handler is set up

to trap any run-time errors and then resume execution of the subroutine with the

statement following the error This method traps the potential error that could be

generated by executing the SQL Drop statement when there’s no existing table

Using the ADO Connection object’s Execute method is the simplest way to

perform dynamic SQL statements In this example, an existing Connection object

currently connected to SQL Server issues the SQL statement The first parameter of

the Execute method takes a string that contains the command to be issued The first

instance uses the SQL Drop Table statement that deletes any existing instances of the

table named Sales.SalesDepartment

Next, Visual Basic’s error handler is reset to branch to the ErrorHandler label if

any run-time errors are encountered This allows any errors encountered during the

creation of the Sales.SalesDepartment table to be displayed by the DisplayADOError

subroutine For more details about ADO error handling, see the section “Error

Handling” later in this chapter The SQL Create Table statement is then performed

using the Connection object’s Execute method

NOTE

The Sales.SalesDepartment table isn’t part of the example AdventureWorks database The Sales.

SalesDepartment table is created to illustrate database update techniques, without altering the

contents of the original tables in the AdventureWorks database.

Modifying Data with ADO

You can modify data with ADO in a number of ways First, ADO supports updatable

Recordset objects that can use the AddNew, Update, and Delete methods to modify

the data contained in an updatable Recordset object ADO also supports updating

data using both dynamic and prepared SQL In the next part of this chapter, you

Trang 10

see how to update SQL Server data using an ADO Recordset object, followed by several examples that illustrate how to update data using prepared SQL and the ADO Command object

Updating Data with the ADO Recordset Object

In addition to performing queries, Recordset objects can also be used to update data

As you have probably surmised after seeing the various parameters of the Recordset object’s Open method, however, not all ADO Recordset objects are updatable The capability to update a Recordset depends on the type of cursor the Recordset object uses, as well as the locking type used Both these factors can be specified as parameters of the Open method or by setting the Recordset object’s CursorType and LockType properties before the Recordset is opened

Both the CursorType and LockType properties influence the capability to update

a Recordset object Table 8-9 summarizes the Recordset object cursor and lock types and their capability to support data update methods

The lock type parameter takes precedence over the cursor type parameter

For instance, if the lock type is set to adLockReadOnly, then the result set isn’t updatable, no matter which cursor type is used

Inserting Rows to a Recordset Object You can use the Recordset object’s AddNew

method in combination with the Update method to add rows to an updatable ADO

adOpenForwardOnly Yes (current row only)

Table 8-9 ADO Recordset Cursor and Lock Types and Updates

Ngày đăng: 03/07/2014, 01:20

TỪ KHÓA LIÊN QUAN