This tutorial explains about The Role of DataSets in ADO.NET , Using DataSets in ASP.NET , Saving DataSets in Session State, Using DataTable Constraints, DataSet, DataRelations Using DataSets with DataAdapters to Modify Data and the Transactional Model in DataSets.
ASP.NET: Managing Data with ADO.NET DataSets and C#
Introduction
In this article we will explore the DataSet, DataTable and DataRelations classes. Those who have worked with classic asp will be familiar with record sets. Record set was the individual rows that were retrieved from the database and than binded to the screen using html table or any other html tags.
DataSet on the other hand is a new technology in Asp.net and this maps the entire database maps in its self. What I mean is it can have all the fields of the tables which we specify. In other words its a disconnected database. By disconnected I mean that if you make changes in Dataset those changes will not be reflected in the actual database.
The Role of DataSets in ADO.NET
The important of datasets can never be denied nor it can be questioned. DataSet is a mirror image of the table or the query which you run. DataSets makes it easier to edit and update the information. Another good thing is that datasets are disconnected in nature so, if you make any changes in the dataset it will not reflect in the database unless use special methods to perform the change and confirm it.
Using DataSets in ASP.NET
Let’s see how we can use datasets in Asp.net. The most common way of using the DataSet control is with the dataadapter. The DataAdapter fills the dataset control with data coming from the database. Let’s see how we can perform this simple action:
SqlDataAdapter ad = new SqlDataAdapter("SELECT * FROm Categories",myConnection);
DataSet ds = new DataSet();
ad.Fill(ds,"Categories");
DataGrid1.DataSource = ds;
DataGrid1.DataBind();
Explanation of the code:
1. First we declare a simple dataadapter instance which fetches all the rows from the Categories table. ( Categories table is present in the Northwind database which is shipped with Sql Server 2000 ).
2. New we created an instance of the DataSet control.
3. Next we fill the dataset with the data coming from the dataadapter control. As you can see that I have written ad.Fill(ds,"Categories"); you can also write ad.Fill(ds); and this will work fine too. In the former case I was telling the dataadapter which table I am using in my query and later the dataadapter was finding the table itself.
4. Finally I used DataGrid to bind the data on the screen.
Iterating through the DataSet:
Here is a simple code to iterate through the dataset and select individual items instead of selecting all the data in the DataSet.
SqlDataAdapter ad = new SqlDataAdapter("SELECT * FROm Categories",myConnection);
DataSet ds = new DataSet();
ad.Fill(ds,"Categories");
DataTable dt = ds.Tables["Categories"];
Response.Write(dt.Rows[0][1].ToString()) ;
1) First few lines are identical which we have done before.
2) In the forth line we declared the DataTable object. DataTable object is used to hold a single table. As I already told you that dataset can hold multiple tables depending upon the query so we can assign a single table from the dataset to the datatable object. I have done that using the line.
DataTable dt = ds.Tables["Categories"];
3) Next we are printing the first row of the second column. Always remember that the number of the rows and columns in the database does not start with 1 but it starts at 0. So in this line of code:
Response.Write(dt.Rows[0][1].ToString()) ;
This line of code means that get Row ‘0’ and Column 1 of the from the datatable. And so we get the value and it prints out "Beverages".
Saving dataSets in Session State:
DataSets can also be saved in the Session State so that it can be available in other areas of the application and in new pages. The way of storing the DataSet in Session State is very easy.
Session["MyDataSet"] = DataSet;
Later if you want to retrieve the DataSet from the Session State you can easily do this by using this line of code:
DataSet ds = (DataSet) Session["MyDataSet"]
As you can see that when I am retrieving the values from the Session object I am casting it into the dataset object. This is because this is explicit conversion and requires casting. I am unboxing in this case.
Using DataTable:
DataTable is also a collection which you can use like dataset. The difference is that DataTable represents only one table. Usually its used when you don’t have a database and want to save something in the collection.
Here is few lines of code that you can use to make a populate the datatable:
// Create a new DataTable.
System.Data.DataTable myDataTable = new DataTable("ParentTable");
// Declare variables for DataColumn and DataRow objects.
DataColumn myDataColumn;
DataRow myDataRow;
// Create new DataColumn, set DataType, ColumnName and add to DataTable.
myDataColumn = new DataColumn();
myDataColumn.DataType = System.Type.GetType("System.Int32");
myDataColumn.ColumnName = "id";
myDataColumn.ReadOnly = true;
myDataColumn.Unique = true;
// Add the Column to the DataColumnCollection.
myDataTable.Columns.Add(myDataColumn);
DataSet Relations:
In a relational representation of data, individual tables contain rows that are related to one another using a column or set of columns. In the ADO.NET DataSet, the relationship between tables is implemented using a DataRelation. When you create a DataRelation, the parent-child relationships of the columns are managed only through the relation. The tables and columns are separate entities. In the hierarchical representation of data that XML provides, the parent-child relationships are represented by parent elements that contain nested child elements. To facilitate the nesting of child objects when a DataSet is synchronized with an XmlDataDocument or written as XML data using WriteXml, the DataRelation exposes a Nested property. Setting the Nested property of a DataRelation to true causes the child rows of the relation to be nested within the parent column when written as XML data or synchronized with an XmlDataDocument. The Nested property of the DataRelation is false, by default. For example, consider the following DataSet:
SqlDataAdapter custDA = new SqlDataAdapter("SELECT CustomerID, CompanyName FROM Customers", nwindConn);
SqlDataAdapter orderDA = new SqlDataAdapter("SELECT OrderID, CustomerID, OrderDate FROM Orders", nwindConn);
nwindConn.Open();
DataSet custDS = new DataSet("CustomerOrders");
custDA.Fill(custDS, "Customers");
orderDA.Fill(custDS, "Orders");
nwindConn.Close();
DataRelation custOrderRel = custDS.Relations.Add("CustOrders",
custDS.Tables["Customers"].Columns["CustomerID"],
custDS.Tables["Orders"].Columns["CustomerID"]);
Because the Nested property of the DataRelation object is not set to true for this DataSet, the child objects will not be nested within the parent elements when this DataSet is represented as XML data.
The following code example shows the output that will result from calling WriteXml on the DataSet.
Note that the Customers element and the Orders elements are shown as sibling elements. If you wanted to have the Orders elements show up as children of their respective parent elements, the Nested property of the DataRelation would need to be set to true and you would add the following:
The following code shows what the resulting output would look like, with the Orders elements nested within their respective parent elements.
Using DataSet with DataAdapters to Modify Data
We can also use DataAdapters to modify data in the database. There are several properties that are available to perform these operations.
Let’s see some of the properties:
ad.SelectCommand = new SqlCommand("SELECT * FROM Person",myConnection);
ad.UpdateCommand = new SqlCommand("UPDATE TABLE Person SET Name=’john’ WHERE PersonID = 1");
ad.DeleteCommand = new SqlCommand("DELETE TABLE Person WHERE PersonID = 1");
ad.InsertCommand = new SqlCommand("INSERT INTO PERSON VALUES(‘NewName’) ");
All the properties are self explanatory. SelectCommand property is used to select, Update command property is used to update and so forth.
When we issue the command we can just later fill the Dataset with the DataAdatper and later we can bind the dataset to datagrid to view the result on the user interface.