ADO.NET
ADO.NET is the strategic application-level interface for providing data access services in the Microsoft .NET Platform. You can use ADO.NET to access data sources using new .NET Data Providers, as well as existing OLE DB Data Providers using the OLE DB .NET Data Provider.
ADO.NET Does Not Depend On Continuously Live Connections
In traditional client/server applications, components establish a connection to a database and keep it open while the application is running. For a variety of reasons, this approach is impractical in many applications:
● Open database connections take up valuable system resources. In most cases, databases can maintain only a small number of concurrent connections. The overhead of maintaining these connections detracts from overall application performance.
● In ASP.NET Web applications, the components are inherently disconnected from each other. The browser requests a page from the server; when the server has finished processing and sending the page, it has no further connection with the browser until the next request. Under these circumstances, maintaining open connections to a database is not viable, because there is no way to know whether the data consumer (the client) requires further data access.
● A model based on always-connected data can make it difficult and impractical to exchange data across application and organizational boundaries using a connected architecture. If two components need to share the same data, both have to be connected, or a way must be devised for the components to pass data back and forth.
Data Can Be Cached in Datasets
A dataset is a cache of records retrieved from a data source. It works like a virtual data store: A dataset includes one or more tables based on the tables in the actual database, and it can include information about the relationships between those tables and constraints on what data the tables can contain.
Datasets Are Independent of Data Sources
Data Is Persisted as XML
Comparison of ADO.NET and ADO
In-memory Representations of Data
In ADO, the in-memory representation of data is the recordset. In ADO.NET, it is the dataset. There are important differences between them.
Number of Tables
A recordset looks like a single table
If a recordset is to contain data from multiple database tables, it must use a JOIN query, which assembles the data from the various database tables into a single result table.
In contrast, a dataset is a collection of one or more tables.
The tables within a dataset are called data tables; specifically, they are DataTable objects
If a dataset contains data from multiple database tables, it will typically contain multiple DataTable objects.
That is, each DataTable object typically corresponds to a single database table or view. In this way, a dataset can mimic the structure of the underlying database.
A dataset usually also contains relationships
A relationship within a dataset is analogous to a foreign-key relationship in a database —that is, it associates rows of the tables with each other.
Because the dataset can hold multiple, separate tables and maintain information about relationships between them, it can hold much richer data structures than a recordset, including self-relating tables and tables with many-to-many relationships.
Data Navigation and Cursors
In ADO you scan sequentially through the rows of the recordset using the ADO MoveNext method.
In ADO.NET, rows are represented as collections, so you can loop through a table as you would through any collection, or access particular rows via ordinal or primary key index.
DataRelation objects maintain information about master and detail records and provide a method that allows you to get records related to the one you are working with
A cursor is a database element that controls record navigation, the ability to update data, and the visibility of changes made to the database by other users.
ADO.NET does not have an inherent cursor object, but instead includes data classes that provide the functionality of a traditional cursor.
For example, the functionality of a forward-only, read-only cursor is available in the ADO.NET DataReader object
Minimized Open Connections
In ADO.NET you open connections only long enough to perform a database operation, such as a Select or Update. You can read rows into a dataset and then work with them without staying connected to the data source.
In ADO the recordset can provide disconnected access, but ADO is designed primarily for connected access.
There is one significant difference between disconnected processing in ADO and ADO.NET
In ADO you communicate with the database by making calls to an OLE DB provider.
In ADO.NET you communicate with the database through a data adapter (an OleDbDataAdapter or SqlDataAdapter object), which makes calls to an OLE DB provider or the APIs provided by the underlying data source.
The important difference is that in ADO.NET the data adapter allows you to control how the changes to the dataset are transmitted to the database — by optimizing for performance, performing data validation checks, or adding any other extra processing.
Sharing Data Between Applications
Transmitting an ADO.NET dataset between applications is much easier than transmitting an ADO disconnected recordset.
To transmit an ADO disconnected recordset from one component to another, you use COM marshalling
To transmit data in ADO.NET, you use a dataset, which can transmit an XML stream.
The transmission of XML files offers the following advantages over COM marshalling:
Richer data types
COM marshalling provides a limited set of data types — those defined by the COM standard. Because the transmission of datasets in ADO.NET is based on an XML format, there is no restriction on data types. Thus, the components sharing the dataset can use whatever rich set of data types they would ordinarily use.
Performance
ADO.NET offers another performance advantage, in that ADO.NET does not require data-type conversions. ADO, which requires COM marshalling to transmit records sets among components, does require that ADO data types be converted to COM data types.
Penetrating Firewalls
A firewall can interfere with two components trying to transmit disconnected ADO recordsets. Remember, firewalls are typically configured to allow HTML text to pass, but to prevent system-level requests (such as COM marshalling) from passing.
Because components exchange ADO.NET datasets using XML, firewalls can allow datasets to pass.
ADO.NET Overview
Namespaces to work with Data
System.Data
The System.Data namespace consists mostly of the classes that constitute the ADO.NET architecture
Classes
Class | Description |
Constraint | Represents a constraint that can be enforced on one or more DataColumn objects. |
ConstraintCollection | Represents a collection of constraints for a DataTable. |
ConstraintException | Represents the exception that is thrown when attempting an action that violates a constraint. |
DataColumn | Represents the schema of a column in a DataTable. |
DataColumnChangeEventArgs | Provides data for the ColumnChanging event. |
DataColumnCollection | Represents a collection of DataColumn objects for a DataTable. |
DataException | Represents the exception that is thrown when errors are generated using ADO.NET components. |
DataRelation | Represents a parent/child relationship between two DataTable objects. |
DataRelationCollection | Represents the collection of DataRelation objects for this DataSet. |
DataRow | Represents a row of data in a DataTable. |
DataRowChangeEventArgs | Provides data for the RowChanged, RowChanging, OnRowDeleting, and OnRowDeleted events. |
DataRowCollection | Represents a collection of rows for a DataTable. |
DataRowView | Represents a customized view of a DataRow exposed as a fully featured Windows Forms control. |
DataSet
| Represents an in-memory cache of data. |
DataTable
| Represents one table of in-memory data. |
DataTableCollection
| Represents the collection of tables for the DataSet. |
DataView | Represents a databindable, customized view of a DataTable for sorting, filtering, searching, editing, and navigation. |
System.Data.Oledb
OleDbConnection
OleDbCommand
OleDbCommandBuilder
OleDbDataAdapter
OleDbParameter
OleDbTransaction
OleDbType-- Specifies the data type of a field, a property, or an System.Data.OleDb.OleDbParameter
System.Data.SQLClient
System.Data.Common – Common shared (or overridden ) by individual data providers
System.Data.SqlTypes – sqlsever datatypes
Working with Data Readers
Demonstration 1: Working with Connection,Command,Datareaders (ExecuteReader,ExecuteScalar,ExecuteNonQuery)
Demonstration2 : Working with DML Operations
Demonstration3: Working with Procedures
using System;
using System.Data.OleDb;
public class a
{
public static void Main()
{
OleDbConnection cn;
cn = new OleDbConnection("Provider=MSDAORA.1;Password=tiger;User ID=scott");
OleDbCommand com=new OleDbCommand();
com.Connection=cn;
com.CommandText = "in1";
com.CommandType = System.Data.CommandType.StoredProcedure; //Text,StoredProcedure,TableDirect
com.Parameters.Add("@eno",1111);
com.Parameters.Add("@ename","hello");
try
{
cn.Open();
com.ExecuteNonQuery();
Console.WriteLine("successful");
}
catch(Exception e)
{
Console.WriteLine(e);
}
finally
{
cn.Close();
}
}
}
Retrieving Return Values and Output Parameters
Ex:
Create procedure getauthorcount as
Return (select count(*) from authors)
Getauthorcount.cs
1. Open the Connection to the database- cn
Dim c As SqlCommand = New SqlCommand("getauthorcount", cn)
c.CommandType = CommandType.StoredProcedure
Dim p As SqlParameter = c.Parameters.Add("ReturnValue", SqlDbType.Int)
p.Direction = ParameterDirection.ReturnValue
cn.Open()
c.ExecuteNonQuery()
Dim i As Integer = c.Parameters("ReturnValue").Value
MsgBox(i)
cn.Close()
Directions:
Input,Output, InputOutput, returnvalue
Improving Performance with Connection Pooling:
Connection pooling is enabled for both oledb and sqlclient connections by default.
Oledbconnection pooling is handled by the oledb .net provider
Sqlclient connection pooling is handled by windows 2000 services
Close() method
Properties:
Connection LifeTime – default 0 that is conn should never get destroyed
Connection Reset - Indicates whether connections should be reset when they are returned to the pool(true)
Enlist -- Indicates whether a connection should be automatically enlisted in the current transaction context. The default value is true
Max Pool Size – 100
Min Pool Size – 0
Pooling - true
Ex:
using System;
using System.Data.SqlClient;
public class connectionpooling
{
public static void Main()
{
connectionpooling myconnectionpooling = new connectionpooling();
myconnectionpooling.Run();
}
public void Run()
{
try
{
String connString;
connString = "server=(local)\\NetSDK;Trusted_Connection=yes;database=northwind;" +
"connection reset=false;" +
"connection lifetime=5;" +
"min pool size=1;" +
"max pool size=50";
SqlConnection myConnection1 = new SqlConnection(connString);
SqlConnection myConnection2 = new SqlConnection(connString);
SqlConnection myConnection3 = new SqlConnection(connString);
// Open two connections.
Console.WriteLine ("Open two connections.");
myConnection1.Open();
myConnection2.Open();
// Now there are two connections in the pool that matches the connection string.
// Return the both connections to the pool.
Console.WriteLine ("Return both of the connections to the pool.");
myConnection1.Close();
myConnection2.Close();
// Get a connection out of the pool.
Console.WriteLine ("Open a connection from the pool.");
myConnection1.Open();
// Get a second connection out of the pool.
Console.WriteLine ("Open a second connection from the pool.");
myConnection2.Open();
// Open a third connection.
Console.WriteLine ("Open a third connection.");
myConnection3.Open();
// Return the all connections to the pool.
Console.WriteLine ("Return all three connections to the pool.");
myConnection1.Close();
myConnection2.Close();
myConnection3.Close();
}
catch (Exception e)
{
// Display the error.
Console.WriteLine(e.ToString());
}
}
}
Transaction Programming
3 levels – Database, ado.net, page
ex:
SqlTransaction tr;
SqlConnection cn=new SqlConnection(“constring”);
SqlCommand cm1=new SqlCommand(“update1”);
SqlCommand cm2=new SqlCommand(“update2”);
Cn.open();
Tr=cn.begintransaction;
Cm1.transaction=tr;
Cm2.transaction=tr;
Try
{
Cm1.executeNonQuery();
Cm2.executeNonQuery();
Tr.commit();
}
Catch(Exception e)
{
Tr.rollback();
}
Transactions
<%@ transaction=”RequiresNew” %>
Disabled – no trans
Supported – if there supports
Required – if not there create a new
RequiresNew – always new
After you enable transactions for an ASP.NET page, the page can use two methods from the ContextUtil Class to explicitly commit or rollback a transaction: the SetComplete and SetAbort
Specifying a Command Behavior:
When you call the ExecuteReader() method of the command object you can pass an optional CommandBehavior Parameter.
The command Behavior enumeration has the following values:
1)CloseConnection :- Automatically closes an open database connection after the datareader is closed
2)KeyInfo :- Retrieves column and primary key with the data
3) SchemaOnly :- Retrieves column and table schema info without retrieving the data
4) SingleRow :- Optimizes command to retrieve only a single row. If multiple rows are returned, additional rows are discarded
The CloseConnection command behavior is useful when you want to return a DataReader from a function
Ex:
Public SqlDataReader GetAuthors()
{
cn.open();
cm=new SqlCommand(“select * from authors”, cn);
return cm.ExecuteReader(CommandBehavior.CloseConnection);
}
Retrieving Table Schema Info
Dr=cm.ExecuteReader(CommandBehavior.KeyInfo or CommandBehavior.SchemaOnly)
Miscellaneous:
ExecuteXmlReader (SQL Provider Only)
As its name implies this method will execute the command and return an XmlReader object to the caller.
SQL Server permits a SQL clause to be extended with a FORXML clause.
Ex:
Dim c As SqlCommand = New SqlCommand("select * from authors FOR XML AUTO", cn)
cn.Open()
Dim xr As XmlReader = c.ExecuteXmlReader()
While (xr.Read())
MsgBox(xr.ReadOuterXml())
End While
cn.Close()
DataSets:
DataSets and DataReaders:
The two sets of classes are useful in different applications.
1)If you simply need to grab some database records and quickly display them on a webpage, you should use the command and DataReader classes
If, On the other hand you need to work with a disconnected and memory resident representation of database records, you need to use DataSets
2)Further more it to work, the DataReader must remain conncted to a database table. A datareader is tied down to its underlying data source. This means for example that you cannot cache a DataReader in your server’s memory so that the same datareader can be used on multiple pages or over multiple requests to the same page.
A dataset enables you to represent the results of a database query in yours server’s memory.
Because a DataSet provides you with a memory-resident representation of data, you can work with the result of a database query as a whole. For ex a dataset includes methods for sorting,filtering and returning a count of the records from a database query.
3)DataReader is a forward only recordset
DataSets are very useful if you want to represent the same set of records over and over again in multiple pages or across multiple requests to the same page.(Caching)
If you need to display the diff. Set of records whenever you request a page, use a datareader.
If you need to display the same set of records when u reques a page, you should use a Dataset
DataTable:
A DataTable is a memory resident representation of a database table in a dataset.
Typically, you create a DataTable from an existing database table.
However, you also have the option of creating a DataTable and add it to DataSet.
A DataTable is collection of rows, represented by its Rows property, and a collection of columns represented by columns property.
Ex:Shopping cart
Dim t As DataTable
Dim c As DataColumn
Dim r As DataRow
t = New DataTable()
c = New DataColumn("id",GetType(Int32))
t.Columns.Add(c)
c = New DataColumn("name")
t.Columns.Add(c)
c = New DataColumn("age")
t.Columns.Add(c)
c = New DataColumn("sal")
t.Columns.Add(c)
r = t.NewRow
r("id") = 1
r("name") = "sss"
r("age") = 20
r("sal") = 10000
t.Rows.Add(r)
r = t.NewRow
r("id") = 2
r("name") = "sss2"
r("age") = 23
r("sal") = 20000
t.Rows.Add(r)
For Each r In t.Rows
For Each c In t.Columns
TextBox1.Text += r(c) & " "
Next
TextBox1.Text += vbCrLf
Next
Setting DataTable Properties:
CaseSensitive-Determines whether comparisions when searching,sorting or filtering records are case sensitive
MinimumCapacity:- specifies the initial number of rows that the DataTable accepts (default is 25)
PrimaryKey-specifies the array of columns to use as the primarykeys for the DataTable
Ex:
DataColumn c=dt.columns(“productid”);
Dt.primarykey=c;
TableName-name of the DataTable
Setting DataColumn properties in DataTable:
AllowDBNull – enables or disables null values in the column(default true)
AutoIncrement – creates a column that increments its values automatically
AutoIncrementSeed – a Long value that represents the initial value for an autoincrement column
AutoIncrementStep- represents long increment value
ColumnName
DataType- specifies the .NET type of the column
DefaultValue
Expression – creates calculated or aggregate functions
MaxLength
ReadOnly – A Boolean value which indicates the column allows updates
Unique
Creating calculated and aggregate columns
1)connection cn
2)dad-select * from products
3)ds
4)dad.fill(ds..)
5)c=new DataColumn(“salePrice”)
6)c.Expression=”unitprice*0.10”
7)ds.tables(0).columns.add(c)
aggregate functions
Max,Min,Avg,Count,Sum,Var…..
--Demonstration on Multiple Tables
--Demonstration on Data Grid
--Demonstraion on XML Integration
DataRelation:
If a DataSet contains multiple DataTables , you can define relationships.
The most common type is parent/child relation
To define the relationship both tables must share a common key
A DataSet has a Relations Property that represents a collection of DataRelations class
Ex:
1)assume that u have two tables with the names products and categories and have a common column categoryid
2)ds.relations.add(“relation1”,ds.tables(“categories”).columns(“categoryid”), ds.tables(“products”).columns(“categoryid”))
3)dp,dc – datarows
4)for each dp in ds.tables(“catgories”). Rows
dp(“categoryname”)
for each dc in dp.getchildrows(“relation1”)
dc(“productname”)
next
next
DataViews:
Represents a particular view on a DataTable. You can use Dataview to display a filtered or sorted view of the rows in a data table
Filtering:
SqlDataAdapter dad= new SqlDataAdapter(“select * from products”,cn);
Dad.fill(ds,”products”);
DataView dv=ds.tables(“products”).DefaultView;
Dv.RowFilter=”categoryid=4”;
Dg.datasource=dv;
Sort property:
dv.sort=”price,discount”
Finding rows in DataView:
dv.Find(“smith”) – if it finds return the row no
-------Cached DataSets
DataConstraint
To check constraint for a table u can iterate through ConstraintsCollection class
Applying constraints
DataColumn[] pk=new DataColumn[1];
Pk[0]=dt.Columns[“productsID”];
Dt.Constraints.Add(new UniqueConstraint(“c1”,pk[0]));
Dt.PrimaryKey=pk;
ForienKeyConstraint and UniqueConstraint
No comments:
Post a Comment