Read Build Your Own ASP.NET 3.5 Website Using C# & VB Online
Authors: Cristian Darie,Zak Ruvalcaba,Wyatt Barnett
Tags: #C♯ (Computer program language), #Active server pages, #Programming Languages, #C#, #Web Page Design, #Computers, #Web site development, #internet programming, #General, #C? (Computer program language), #Internet, #Visual BASIC, #Microsoft Visual BASIC, #Application Development, #Microsoft .NET Framework
More on SqlDataSource
The SqlDataSource object can make programming easier when it’s used correctly
and responsibly. However, the simplicity of the SqlDataSource control comes at
the cost of flexibility and maintainability, and introduces the potential for performance problems. The main advantage of your new
AddressBook.aspx
file is that it’s incredibly easy
and quick to implement, especially if you’re using Visual Web Developer.
However, embedding SQL queries right into your
.aspx
files does have a major disadvantage if you intend to grow your web site: in more complex applications containing many forms that perform data-related tasks, an approach that sees you storing all of your SQL queries inside different SqlDataSource controls can degenerate very quickly into a system that’s very difficult to maintain. When you’re writing real-world applications, you’ll want to have all the data access logic centralized in specialized classes. This way, a change to the database design would mean that you’d need to change only the data access code; if your application was written
using SqlDataSource controls, you’d need to check each web form and update it
manually.
Another disadvantage of using the SqlDataSource is that its sorting and paging
features usually aren’t as fast and efficient as they could be if you used a custom
SQL query that returned the data already paged and/or sorted from the database.
When we use the GridView’s paging feature, for example, the SqlDataSource control
doesn’t limit the number of records we read from the database. Even if only a small
subset of data needs to be shown, unless customizations are implemented, the entire
table will be read from the database, and a subset of the data displayed. Even if only
three records need to be displayed,
all
of the records in the table will be returned. An interesting property of SqlDataSource that’s worth noting is DataSourceMode,
whose possible values are DataSet or SqlDataReader. The DataSet mode is the
default mode, and implies that the SqlDataSource will use a DataSet object to retrieve its data. We’ll analyze the DataSet class next. The other mode is Licensed to [email protected]
Advanced Data Access
515
SqlDataReader, which makes the SqlDataSource use your old friend, the
SqlDataReader, behind the scenes.
So, what is this DataSet class? Since version 1.0, the .NET Framework has come
with a number of objects—DataSet, DataTable, DataView, SqlDataAdapter, and
others—that provide
disconnected
data access. So, instead of having the database
return the exact data you need for a certain task in the exact order in which you
need it, you can use these objects to delegate some of the responsibility of filtering
and ordering the data to your C# or VB code.
Both the DataSet and SqlDataReader settings of DataSourceMode have advantages
and disadvantages, and the optimum approach for any task will depend on the task
itself. There are circumstances in which it makes sense to store the data locally,
and you need to be aware of all the possibilities in order to be able to make an informed decision about which mode to use.
Working with Data Sets and Data Tables
We’ve been working with databases for a while now. Initially, you learned about
the SqlDataReader, and used it to populate your controls. Then, in the first half of
this chapter, we gained first-hand experience with the data source controls, which
can automate many features for you. Let’s learn about one more technique you can
use to get data to your visitors.
I know that all these options can be confusing at first, but hang in there. You need
to play around with all of them before you can become an experienced ASP.NET
developer!
The DataSet object is at the center of Microsoft’s model for presenting
disconnected
data
. Disconnected data—data that resides in memory and is completely independent
of the data source—gives us a raft of new opportunities of developing desktop and
web apps.
In
Chapter 9, you learned about the role that data readers
play in relation to applications and database data. Whenever we need to access data from a database, we create a connection object and a command object. These two objects are used together
to create a data reader object, which we can use within our application by binding
it to a data control for presentation purposes. Figure 12.20 illustrates this process.
Licensed to [email protected]
516
Build Your Own ASP.NET 3.5 Web Site Using C# & VB
So, what’s the problem? Well, while they’re the fastest way to retrieve data from a
database, data readers can’t be used to carry out any significant work—you can’t
use them to sort, filter
, or page through the data. As the arrows in Figure 12.20 show
, data readers present a forward-only stream of data to the application: you can’t go
back to a previous record, or reuse that data reader somewhere else. Moreover, once
a data reader has been created, it remains tied to the database. This means that you
can’t make multiple requests to a database using the same data reader.
Data sets, on the other hand, are much more flexible. Imagine a virtual database
that you’re free to use in code whenever and however you wish. That’s a data set.
As we’ll see in the next section, data sets have all the bells and whistles that databases offer, including tables, columns, rows, relationships, and even queries! A data set is a memory-resident copy of database data, so, once a data set has been created,
it can be stored in memory and its ties to the database can be broken. Then, when
you need to work with the data, you don’t need to re-query the database—you simply
retrieve the data from the data set again and again. Figure 12.21 illustrates this point.
Figure 12.22. Multiple pages making multiple requests from the same data set
An even greater advantage of data sets is that they can be shared among multiple
requests, as illustrated in Figure 12.22.
What this means is that you simply need to create the data set once per request.
Once the data set has been created, it can be used by many different pages, all of
which may make multiple—and even different—requests to that data set.
However, data sets require more memory and resources than do data readers. A data
reader simply keeps track of its position within the results of a query, whereas a
data set can contain a local copy of an entire database. The larger the amount of
data kept in the data set, the more memory the data set uses.
Licensed to [email protected]
Advanced Data Access
517
Figure 12.20. Retrieving data using a data reader
Figure 12.21. Breaking the data set’s ties to the data source once it has been created
When you’re deciding whether to use data readers or data sets, you need to consider
the purpose for which you need the data. This decision is important, because it affects:
■ resources consumed on the database server
■ resources consumed on the application server
■ the overall application architecture
Licensed to [email protected]
518
Build Your Own ASP.NET 3.5 Web Site Using C# & VB
If you’re only reading the data, using a data reader can make sense. If you also need
to update, insert, or delete data, or you need to process the data within your code,
data sets might be of more help.
This section will teach you everything you need to know to begin working with
data sets.
What Is a Data Set Made From?
A data set comprises many parts, all of which are required for its usage. We’ll meet
and discuss the following classes in this section:
■ DataSet
■ SqlDataAdapter
■ DataTable
■ DataColumn
■ DataRow
■ DataRelation
■ DataView
We need to use most of these classes in order to work with data sets. For instance,
the SqlDataAdapter class acts as the communication point between the DataSet
and the database. The data adapter knows how to fill a DataSet with data from the
data source; it also knows how to submit to the data source any changes you’ve
made to a DataSet.
Data Adapters
Of all these objects, only SqlDataAdapter depends on a particular data provider,
and as such, it’s interchangeable with other classes that work with data providers,
including OracleDataAdapter, OleDbDataAdapter, and so on. As this class
is the bridge between the database and your local data storage objects (the other
classes mentioned), it makes sense for the class to be database-specific. The
DataSet, DataTable, and other classes store the data locally and don’t need to