
- •Preface
- •Who Should Read This Book
- •Organization and Presentation
- •Contacting the Authors
- •Acknowledgments
- •Contents
- •Introduction
- •Why Microsoft .NET?
- •The Microsoft .NET Architecture
- •Internet Standards
- •The Evolution of ASP
- •The Benefits of ASP.NET
- •What Is .NET?
- •.NET Experiences
- •.NET Clients
- •.NET Services
- •.NET Servers
- •Review
- •Quiz Yourself
- •Installation Requirements
- •Installing ASP.NET and ADO.NET
- •Installing the .NET Framework SDK
- •Testing Your Installation
- •Support for .NET
- •Review
- •Quiz Yourself
- •Designing a Database
- •Normalization of Data
- •Security Considerations
- •Review
- •Quiz Yourself
- •Creating a Database
- •Creating SQL Server Tables
- •Creating a View
- •Creating a Stored Procedure
- •Creating a Trigger
- •Review
- •Quiz Yourself
- •INSERT Statements
- •DELETE Statements
- •UPDATE Statements
- •SELECT Statements
- •Review
- •Quiz Yourself
- •The XML Design Specs
- •The Structure of XML Documents
- •XML Syntax
- •XML and the .NET Framework
- •Review
- •Quiz Yourself
- •ASP.NET Events
- •Page Directives
- •Namespaces
- •Choosing a Language
- •Review
- •Quiz Yourself
- •Introducing HTML Controls
- •Using HTML controls
- •How HTML controls work
- •Intrinsic HTML controls
- •HTML Control Events
- •The Page_OnLoad event
- •Custom event handlers
- •Review
- •Quiz Yourself
- •Intrinsic Controls
- •Using intrinsic controls
- •Handling intrinsic Web control events
- •List Controls
- •Rich Controls
- •Review
- •Quiz Yourself
- •Creating a User Control
- •Adding User Control Properties
- •Writing Custom Control Methods
- •Implementing User Control Events
- •Review
- •Quiz Yourself
- •Common Aspects of Validation Controls
- •Display property
- •Type Property
- •Operator Property
- •Using Validation Controls
- •RequiredFieldValidator
- •RegularExpressionValidator
- •CompareValidator
- •RangeValidator
- •CustomValidator
- •ValidationSummaryx
- •Review
- •Quiz Yourself
- •Maintaining State Out of Process for Scalability
- •No More Cookies but Plenty of Milk!
- •Out of Process State Management
- •Review
- •Quiz Yourself
- •Introducing the Key Security Mechanisms
- •Web.config and Security
- •Special identities
- •Using request types to limit access
- •New Tricks for Forms-based Authentication
- •Using the Passport Authentication Provider
- •Review
- •Quiz Yourself
- •ASP.NET Updates to the ASP Response Model
- •Caching with ASP.NET
- •Page Output Caching
- •Absolute cache expiration
- •Sliding cache expiration
- •Fragment Caching
- •Page Data Caching
- •Expiration
- •File and Key Dependency and Scavenging
- •Review
- •Quiz Yourself
- •A Brief History of Microsoft Data Access
- •Differences between ADO and ADO.NET
- •Transmission formats
- •Connected versus disconnected datasets
- •COM marshaling versus text-based data transmission
- •Variant versus strongly typed data
- •Data schema
- •ADO.NET Managed Provider Versus SQL Managed Provider
- •Review
- •Quiz Yourself
- •Review
- •Quiz Yourself
- •Creating a Connection
- •Opening a Connection
- •Using Transactions
- •Review
- •Quiz Yourself
- •Building a Command
- •Connection property
- •CommandText property
- •CommandType property
- •CommandTimeout property
- •Appending parameters
- •Executing a Command
- •ExecuteNonQuery method
- •Prepare method
- •ExecuteReader method
- •Review
- •Quiz Yourself
- •Introducing DataReaders
- •Using DataReader Properties
- •Item property
- •FieldCount property
- •IsClosed property
- •RecordsAffected property
- •Using DataReader Methods
- •Read method
- •GetValue method
- •Get[Data Type] methods
- •GetOrdinal method
- •GetName method
- •Close method
- •Review
- •Quiz Yourself
- •Constructing a DataAdapter Object
- •SelectCommand property
- •UpdateCommand, DeleteCommand, and InsertCommand properties
- •Fill method
- •Update method
- •Dispose method
- •Using DataSet Objects
- •DataSetName property
- •CaseSensitive property
- •Review
- •Quiz Yourself
- •Constructing a DataSet
- •Tables property
- •TablesCollection Object
- •Count property
- •Item property
- •Contains method
- •CanRemove method
- •Remove method
- •Add method
- •DataTable Objects
- •CaseSensitive property
- •ChildRelations property
- •Columns property
- •Constraints property
- •DataSet property
- •DefaultView property
- •ParentRelations property
- •PrimaryKey property
- •Rows property
- •Dispose method
- •NewRow method
- •Review
- •Quiz Yourself
- •What Is Data Binding?
- •Binding to Arrays and Extended Object Types
- •Binding to Database Data
- •Binding to XML
- •TreeView Control
- •Implement the TreeView server control
- •Review
- •Quiz Yourself
- •DataGrid Control Basics
- •Binding a set of data to a DataGrid control
- •Formatting the output of a DataGrid control
- •Master/Detail Relationships with the DataGrid Control
- •Populating the Master control
- •Filtering the detail listing
- •Review
- •QUIZ YOURSELF
- •Updating Your Data
- •Handling the OnEditCommand Event
- •Handling the OnCancelCommand Event
- •Handling the OnUpdateCommand Event
- •Checking that the user input has been validated
- •Executing the update process
- •Deleting Data with the OnDeleteCommand Event
- •Sorting Columns with the DataGrid Control
- •Review
- •Quiz Yourself
- •What Is Data Shaping?
- •Why Shape Your Data?
- •DataSet Object
- •Shaping Data with the Relations Method
- •Review
- •Quiz Yourself
- •OLEDBError Object Description
- •OLEDBError Object Properties
- •OLEDBError Object Methods
- •OLEDBException Properties
- •Writing Errors to the Event Log
- •Review
- •Quiz Yourself
- •Introducing SOAP
- •Accessing Remote Data with SOAP
- •SOAP Discovery (DISCO)
- •Web Service Description Language (WSDL)
- •Using SOAP with ASP.NET
- •Review
- •Quiz Yourself
- •Developing a Web Service
- •Consuming a Web Service
- •Review
- •Quiz Yourself
- •ASP and ASP.NET Compatibility
- •Scripting language limitations
- •Rendering HTML page elements
- •Using script blocks
- •Syntax differences and language modifications
- •Running ASP Pages under Microsoft.NET
- •Using VB6 Components with ASP.NET
- •Review
- •Quiz Yourself
- •Preparing a Migration Path
- •ADO and ADO.NET Compatibility
- •Running ADO under ASP.NET
- •Early Binding ADO COM Objects in ASP.NET
- •Review
- •Quiz Yourself
- •Answers to Part Reviews
- •Friday Evening Review Answers
- •Saturday Morning Review Answers
- •Saturday Afternoon Review Answers
- •Saturday Evening Review Answers
- •Sunday Morning Review Answers
- •Sunday Afternoon Review Answers
- •What’s on the CD-ROM
- •System Requirements
- •Using the CD with Windows
- •What’s on the CD
- •The Software Directory
- •Troubleshooting
- •ADO.NET Class Descriptions
- •Coding Differences in ASP and ASP.NET
- •Retrieving a Table from a Database
- •Displaying a Table from a Database
- •Variable Declarations
- •Statements
- •Comments
- •Indexed Property Access
- •Using Arrays
- •Initializing Variables
- •If Statements
- •Case Statements
- •For Loops
- •While Loops
- •String Concatenation
- •Error Handling
- •Conversion of Variable Types
- •Index

Session 20—Introducing DataSets, Part I |
199 |
Constructing a DataAdapter Object
As with many ADO.NET objects, there are several ways to construct a DataAdapter object. The default constructor is as follows:
oDA = New OleDbDataAdapter()
You’ll notice that no parameters are passed using the default method. The DataAdapter’s properties need to be set explicitly after construction. With the second method, we construct a DataAdapter with a specified select OleDbCommand object as follows:
oDA = New OleDbDataAdpater(oCmd)
The third method initializes a new instance of a DataAdapter with a select command string (for example a SQL statement) and a valid OleDbConnection object as follows:
oDA = New OleDbDataAdapter(sSQL, oConn)
Finally, we can initialize an OleDbDataAdapter with a select command string and a connection string as follows:
oDSComd = New OLEDBDataAdapter(sSQL, sConnString)
This method of constructing a DataAdapter object differs from the previous because a connection to the database specified in the connection string is created when the DataAdapter is executed.
In the following snippet of code, we demonstrate initializing a DataAdapter object by passing a command string and an OleDbConnection object:
<%@ Page Language=”VB” %>
<%@ Import Namespace=”System.Data” %>
<%@ Import Namespace=”System.Data.OleDb” %> <SCRIPT LANGUAGE=”VB” RUNAT=”server”>
Sub Page_Load(Sender As Object, E As EventArgs) Dim oConn As OleDbConnection
Dim oDA As OleDbDataAdapter
oConn = New OleDbConnection(“Provider=SQLOLEDB;Data
Source=(local);Initial Catalog=Music;User ID=music;Password=music”)
oConn.Open
oDA = New OleDbDataAdapter(“SELECT * FROM t_bands”, oConn) oDA = Nothing
oConn.Close() oConn = Nothing
End Sub </SCRIPT>
The DataSet object provides several very useful properties, most of which revolve around manipulating DataSet content.

200 |
Saturday Evening |
SelectCommand property
The SelectCommand property gets or sets a Command object used to select records in a DataSet. In following code snippet, we will create an OleDbDataAdapter object and set the
SelectCommand:
<%@ Page Language=”VB” %>
<%@ Import Namespace=”System.Data” %>
<%@ Import Namespace=”System.Data.OleDb” %> <SCRIPT LANGUAGE=”VB” RUNAT=”server”>
Sub Page_Load(Sender As Object, E As EventArgs) Dim oConn As OleDbConnection
Dim oCmd As OleDbCommand Dim oDA As OleDbDataAdapter
oConn = New OleDbConnection(“Provider=SQLOLEDB;Data
Source=(local);Initial Catalog=Music;User ID=music;Password=music”)
oConn.Open()
oCmd = New OleDbCommand(“SELECT * FROM t_bands”, oConn)
oDA = New OleDbDataAdapter() oDA.SelectCommand = oCmd
End Sub </SCRIPT>
You notice in the previous example that we (1) create an OleDbConnection object, (2) create an OleDbCommand object, (3) construct an OleDbDataAdapter object, and (4) set the
OleDbDataAdapter object’s SelectCommand equal to the previously created OleDbCommand object.
When the SelectCommand property is set to a previously created Command object, as in the previous example, the Command object is not cloned. The SelectCommand merely maintains a reference to the Command object — as shown in the following example. We set the SelectCommand property without explicitly creating a Command object:
<%@ Page Language=”VB” %>
<%@ Import Namespace=”System.Data” %>
<%@ Import Namespace=”System.Data.OleDb” %> <SCRIPT LANGUAGE=”VB” RUNAT=”server”>
Sub Page_Load(Sender As Object, E As EventArgs) Dim oConn As New OleDbConnection
Dim oDA As New OleDbDataAdapter
With oConn
.ConnectionString = “Provider=SQLOLEDB;Data Source=(local);Initial
Catalog=Music;User ID=music;Password=music”
.Open
End With

Session 20—Introducing DataSets, Part I |
201 |
oDA.SelectCommand = New OleDbCommand With oDA.SelectCommand
.CommandType = CommandType.Text
.CommandText = “SELECT * FROM t_bands”
.Connection = oConn End With
oDA = Nothing oConn.Close oConn = Nothing
End Sub </SCRIPT>
Make sense? In effect, we’re creating the SelectCommand explicitly.
UpdateCommand, DeleteCommand, and InsertCommand properties
The UpdateCommand property is used to get or set the command used to update records in the data source. The UpdateCommand is effectively the Command object used to update records in the data source for modified rows in the DataSet. When a DataAdapter object’s Update method is called and (1) the UpdateCommand property is not set and (2) primary key information is present in the DataSet, the UpdateCommand will be generated automatically.
To keep things brief here, just say that the DeleteCommand and InsertCommand properties are used to get or set the command used to delete or insert, respectively, records in the data source when the Update method is called.
We’ll return to the DataAdapter properties later. But first, take a look at the methods you can use to create DataSet objects.
Fill method
The Fill method is probably the DataAdapter method you will use most frequently. Simply stated, the Fill method adds data from your data source to a dataset. The Fill method accepts a variety of parameters including the DataSet object to fill, a string representing the alias for the newly created DataSet object, an integer representing the lower bound of records to retrieve, and an integer representing the upper bound of records to retrieve from our data source. Here are some examples:
oDSCmd.Fill(oDS)
oDSCmd.Fill(oDS, “Band Information”)
In the previous sample, the only parameter that is required is the DataSet. Listing 20-1 details how to create a DataSet called “Band Information” and bind it to a DataGrid, dgBands, control.

202 |
Saturday Evening |
Listing 20-1 Creating a DataSet and binding it to a DataGrid control
<%@ Page Language=”VB” %>
<%@ Import Namespace=”System.Data” %>
<%@ Import Namespace=”System.Data.OleDb” %> <SCRIPT LANGUAGE=”VB” RUNAT=”server”>
Sub Page_Load(Sender As Object, E As EventArgs) Dim oConn As OleDbConnection
Dim oDA As OleDbDataAdapter Dim oDS As New DataSet
oConn = New OleDbConnection(“Provider=SQLOLEDB;Data
Source=(local);Initial Catalog=Music;User ID=music;Password=music”)
oConn.Open
oDA = New OleDbDataAdapter(“SELECT * FROM t_bands”, oConn) oDA.Fill(oDS, “Band Information”)
dgBands.DataSource = oDS dgBands.DataBind()
oDS.Dispose() oDS = Nothing oDA.Dispose() oDA = Nothing oConn.Close() oConn = Nothing
End Sub </SCRIPT> <HTML> <BODY>
<asp:DataGrid id=”dgBands” runat=”server” BorderColor=”#000000” BorderWidth=”2”
GridLines=”Both”
CellPadding=”5”
CellSpacing=”0”
Font-Name=”Arial” HeaderStyle-BackColor=”#C0C0C0”
/>
</BODY>
</HTML>
As you can see, we simply create and open a connection to the Music database, create a DataAdapter object, and fill the DataSet by calling the Fill method. If you run this example, you may be a little surprised by the output. Instead of a list of bands from the t_bands table, you actually get a list of the tables in the DataSet. That is because in the process of binding the DataSet, oDS, to the DataGrid control, dgBands, we set the DataGrids DataSource property as follows:
dgBands.DataSource = oDS