Contents
1. Introduction
2. Database Updates from
Datasets
3. Oracle9i Updates
from Datasets
More Information on installing the .Net Framework click here.
Summary
Datasets Datasets are a fundamental part of the ADO.NET architecture, providing both
high-performance data access as well as scalability. Datasets store data in a
disconnected cache. The structure of a dataset is similar to that of a
relational database; it exposes a hierarchical object model of tables, rows, and
columns. In addition, it contains constraints and relationships defined for the
dataset.
Two Step Process
Updating a data source via a dataset is a two-step process. The first
step is to update the dataset with new information — new records, changed
records, or deleted records.
If you are updating a data source (such as a database), the second step is to
send the changes from the dataset to the original data source. That is, the process
of updating the dataset does not also write the changes through to an underlying data
source; you must explicitly perform this second step.
After changes have been made in a dataset, you can transmit the changes to a data
source. Most commonly, you do this by calling the Update method of a data
adapter. The method loops through each record in a data table, determines what type
of update is required (update, insert, or delete), if any, and then executes the
appropriate command.
How an Update Is Transmitted to the Data Source
As an illustration of how updates are made, suppose your application uses a dataset
containing a single data table. The application fetches two rows from the database.
After the retrieval, the in-memory data table looks like this:
(RowState)
FirstName LastName
(Unchanged)
Nancy
Buchanan
(Unchanged)
James Wilson
Your application changes "James" to "Jim". As a result of this change, the value of
the DataRow.RowState property for that row changes from Unchanged to
Modified. The value of the RowState property for the other row remains
Unchanged. The data table now looks like this:
(RowState)
FirstName LastName
(Unchanged)
Nancy
Buchanan
(Modified)
Jim
Wilson
You application now calls the Update method to transmit the dataset to the database.
The method inspects each row in turn. For the first row, the method transmits no SQL
statement to the database, because that row has not changed since it was originally
fetched from the database.
For the second row, however, the Update method automatically invokes the proper data
command and transmits it to the database. The specific syntax of the SQL statement
depends on the dialect of SQL supported by the underlying data store. But the
following general traits of the transmitted SQL statement are noteworthy:
-
The transmitted SQL statement is an UPDATE statement. The OracleDataAdapter or
SqlDataAdapter know to use an UPDATE statement because the value of the RowState
property is Modified.
-
The transmitted SQL statement includes a WHERE clause. The information for the
WHERE clause is derived from the original version of the record
(DataRowVersion.Original), in case values required to identify the row have been
changed.
-
The transmitted SQL statement includes the SET clause, to set the new values of the
modified columns.
If you are building applications using Microsoft® .NET against an Oracle backend
database, you will want to take a close look at the new .NET Framework Data Provider
for Oracle released on MSDN in June 2002. The goal of the provider is to boost the
performance and scalability of .NET applications with Oracle databases by
providing a native .NET interface to Oracle databases that bypasses the need
to use an OLE DB provider.
The .NET Framework Data Provider for Oracle, unlike the Microsoft OLE DB provider for
Oracle, also supports new Oracle 9i datatypes, as well as ref cursors
(useful for running Oracle stored procedures that return result sets). This provider,
System.Data.OracleClient, is similar to the .NET Framework Data Provider for SQL
Server, System.Data.SqlClient.
Until recently, the primary mechanism developers used to access Oracle databases from
.NET application was OLE DB, channeling database requests through the
System.Data.OleDb data classes. However, developers writing .NET data-driven
applications against SQL Server have been able to take advantage of the super-fast
System.Data.SqlClient data classes, which provide data access to SQL Server via a SQL
Server provider written in managed .NET code. This provider communicates to SQL
Server via the native SQL Server client libraries, and derives very fast
speeds. While OLE DB provided an adequate data access mechanism for .NET applications
to communicate with Oracle backends, certainly developers have been asking for a
faster, more scalable Oracle data access mechanism to get better performance for the
.NET applications. The new .NET Framework Data Provider for Oracle, recently released
on MSDN, provides just this.
Basically, developers now have a much faster database access mechanism for ADO.NET in
the form of new System.Data.OracleClient framework classes that work in much
the same way as the System.Data.SqlClient classes. In both cases, the fastest
database read mechanism will be ADO.NET Data Readers, as opposed to Data Sets,
although both are fully functional using the new Oracle Managed Provider. The good
news is the new OracleClient classes should provide significant performance
improvements for .NET applications, and migrating code between OLE DB data classes
and OracleClient data classes is not very difficult, although some work is required.
However, the performance boost can be dramatic.
The OLE DB client classes are designed to provide a database-independent layer for
accessing generic databases. While the value of a generic layer is nearly universal
access, it is difficult to deliver database-specific optimizations in this generic
access layer. Also, the OLE DB layer is implemented as a COM library, so the
System.Data.Oledb namespace works through COM interop. To achieve the significant
performance boost described here, the .NET Framework Data Provider for Oracle avoids
the cost of COM interop, and also employs Oracle-specific optimizations.
The Microsoft® .NET Framework Data Provider for Oracle is an add-on component to
the Microsoft .NET Framework that provides access to an Oracle database using the
Oracle Call Interface (OCI) as provided by Oracle Client software. Oracle 8i
Release 3 (8.1.7) Client or later must be installed for this provider to function.
The Oracle .NET Data Provider is available for
download
The following files are installed by Setup:
|
File name
|
Description
|
|
Eula.rtf
|
.NET Framework Data Provider for Oracle end-user license agreement.
|
|
Oracleref.chm
|
.NET Framework Data Provider for Oracle documentation.
|
|
Oracleref.chi
|
Index file that accompanies Oracleref.chm (.NET Framework Data Provider for
Oracle documentation).
|
|
Readme.txt
|
Additional product information that is not contain in Oracleref.chm (.NET
Framework Data Provider for Oracle documentation).
|
|
System.Data.OracleClient.dll
|
The .NET Framework Data Provider for Oracle.
|
|
Mtxoci8.dll
|
DLL that provides distributed transaction support.
|
All of these files, except Mtxoci8.dll, are installed in C:\Program
Files\Microsoft.NET\OracleClient.Net by default (assuming that C:\Program Files is
your default Program Files folder location). Mtxoci8.dll is installed in the windows
system directory (for example, C:\Windows\System32 on a Windows 2000 computer on
which C: is the system drive).
As part of Setup, the System.Data.OracleClient namespace is added to the
global assembly cache.
using System;
using System.Data;
using System.Data.OracleClient;
public class DataSetTrans
{
public static void Main(string[] args)
{
OracleConnection con;
OracleDataAdapter da;
DataSet ds = new
DataSet();
// Setup connection string to access Oracle
9i
string connectionString = "Data Source=ARK2;User ID=scott;
Password=tiger";
// Instantiate the connection, passing
the
// connection string into the constructor
con = new OracleConnection(connectionString);
// Open the connection
con.Open();
// Populate DataSet and close the Database
Connection
string sql = "SELECT empno,ename,job FROM emp";
da = new OracleDataAdapter (sql,con);
da.Fill(ds,"Emp");
// Close the connection
con.Close();
// Display the Column Names
foreach (DataColumn dc in ds.Tables[0].Columns) {
Console.Write("{0,15}", dc.ColumnName);
}
Console.Write("\n");
// Display the Data in the DataSet Row by
Row
foreach (DataRow dr in ds.Tables[0].Rows) {
// Loop through the Columns for
the current Row
for (int i=0; i<ds.Tables[0].Columns.Count; i++)
{
Console.Write("{0,15}", dr[i]);
}
Console.Write("\n");
}
// Change a value in the DataSet
ds.Tables[0].Rows[8]["ENAME"] = "ZAHN";
// Reconnect to the Database
con.Open();
// Create the CommandBuilder
object
OracleCommandBuilder cb = new OracleCommandBuilder(da);
// Display the generated Update
Command
Console.WriteLine("UPDATE: " +
cb.GetUpdateCommand().CommandText);
// Update Orcale from the
DataSet
try
{
da.Update(ds,"Emp");
ds.AcceptChanges();
Console.WriteLine("Transaction successfully committed
...");
}
catch(Exception e)
{
ds.RejectChanges();
Console.WriteLine(e.Message);
Console.WriteLine("Transaction failed - Rolled back
...");
}
finally
{
con.Close();
}
}
}
This file is called DataSetTransOra.cs, we can compile it from the command
line by typing csc /r:System.Data.OracleClient.dll DataSetTransOra.cs.
The reference to the System.Data.OracleClient.dll is needed.
|