A Dataset is an in-memory data store that can hold numerous tables. Datasets only hold data and do not interact with a data source. It is the SqlDataAdapter that manages connections with the data source and gives us disconnected database behavior. The SqlDataAdapter opens a connection only when required and closes it as soon as it has performed its task. For example, the SqlDataAdapter performs the following tasks when filling a Dataset with data:
· Open connection
· Retrieve data into Dataset
· Close connection
And performs the following actions when updating data source with Dataset changes:
· Open connection
· Write changes from Dataset to data source
· Close connection
In between the Fill and Update operations, data source connections are closed and we are free to read and write data with the Dataset as we need.
Features of Dataset
There are six main features of dataset. They are:
· Working with disconnected data
· Scrolling, Sorting, Searching, and Filtering
· Working with Hierarchical Data
· Caching Changes
· XML Integration
· Uniform Functionality
Working with disconnected data
Data in DataSet are disconnected from database. Connection to the database is only established when the data from the database is to be fetched into the dataset using DataAdapter. Changes made in the dataset will not affect the database and changes made in the database will not be reflected in our dataset.
The main advantage of working with disconnected database is that there is no need of live connection to the database. Once the result of query is fetched from database into the DataSet, the connection to the database can be closed.
Disconnected data structures such as DataSets are also helpful when building multi-tiered applications. If the application uses business objects running on a middle-tier server to access database, business object needs to pass disconnected data structures to client application.
Scrolling, Sorting, Searching, and Filtering
We can check any row of data in DataSet at any time and any number of times. We can move from first record to last and from last record to middle any number of times, which means we can loop back and forth through the results of query as often as we like. We can sort the data in the DataSet according to column or number of columns. We can search for a row of data based on simple search criteria. We can also apply a filter to the data in DataSet so that only rows that satisfy the desired criteria are visible.
Working with Hierarchical Data
DataSet objects are designed to work with hierarchical data. The DataSet object lets us define relationships between the tables of data stored in the DataSet.
Changes made in rows can be cached in the dataset and can be submitted to the database using DataAdapter after all changes made. Changes or modifications in row or table can be examined and can be compared with the original database before submitting it to the database. This can be helpful in multi-tier application where every user can change or modifications in rows or table, to determine how the rows are modified (insert, delete or modified).
Through ADO.NET DataSet we can save and load the contents of a DataSet to and from files as XML documents. The DataSet also allows separating the schema information (table, column, and constraint information) into an XML schema file. In ADO.NET, DataSet objects and XML documents are almost interchangeable. We can easy to move from one data structure to the other.
Unlike Recordset, DataSet object supports features such as filtering, searching, sorting, and caching updates.
Creating a Dataset Object
DataSet ds = new DataSet();
The code above creates a new Dataset ‘ds’.
Creating A SqlDataAdapter
The SqlDataAdapter holds the SQL commands and connection object for reading and writing data. We initialize it with a SQL select statement and connection object:
SqlDataAdapter da = new SqlDataAdapter(
"select * from Employee", con);
The code above creates a new SqlDataAdapter da. The SQL select statement specifies what data will be read into a DataSet. The connection object, con, should have already been instantiated, but not opened. It is the SqlDataAdapter's responsibility to open and close the connection during Fill and Update method calls.
Filling the DataSet
Once we have a Dataset and SqlDataAdapter instances, we need to fill the Dataset.
The Fill method, in the code above, takes two parameters: a Dataset and a table name. The Dataset must be instantiated before trying to fill it with data. The second parameter is the name of the table that will be created in the Dataset.
After modifications are made to the data, we'll want to write the changes back to the database.
cb = new System.Data.SqlClient.SqlCommandBuilder(da);
The table contains a list of records that have been modified and the Insert, Update, and Delete properties of the SqlDataAdapter contain the SQL statements used to make database modifications.