Professional Documents
Culture Documents
NET
Dietrich Birngruber
Software Architect
TechTalk
www.techtalk.at
Contents
z Part I: Basics
z Part II: Connection-Oriented Scenario
z Part III: Disconnected Scenario
z Part IV: Data Access Layer Sample
Application Oracle
(object-oriented) implementation 1 Oracle
IBM
implementation 2 IBM Host
Application
(object-oriented) ??? data access
implementation 3 ???
(.NET) Applications
ADO.NET
.NET data
.NET Application types
data
SQL commands
DataSet IDataReader
ADO.NET
consumer
data
IDbCommand
data
provider SqlCommand OleDbCommand XYCommand*
z Scenarios with …
– low number of concurrent accesses
– short running transactions
– data always up to date
z Scenarios with …
– a lot of concurrent, long running read accesses (e.g. web)
z Part I: Basics
z Part II: Connection-Oriented Scenario
z Part III: Disconnected Scenario
z Part IV: Data Access Layer Sample
using System.Data;
....
1.) Declare connection;
try { // optional
1.) Create connection to data source;
2.) Execute SQL commands;
3.) Compute result;
4.) Release resources;
} catch ( Exception ) {
Handle exception or dispatch it;
} finally {
try { // optional
4.) Close connection;
} catch (Exception) { Handle exception; }
}
)
ADO.NET, Dietrich Birngruber, TechTalk 12
Code: EmployeeReader (2)
//....
//----- execute command object; it returns an OleDbDataReader
IDataReader reader = cmd.ExecuteReader();
2.) object[] dataRow = new object[reader.FieldCount];
//----- read data row by row ... forward only cursor
while (reader.Read()) {
3.) int cols = reader.GetValues(dataRow);
for (int i = 0; i < cols; i++) Console.Write("| {0} " , dataRow[i]);
Console.WriteLine();
}
//----- close reader and release resources
reader.Close();
4.) } catch (Exception e) {
Console.WriteLine(e.Message);
} finally {
try {
if (con != null)
4.) con.Close(); // ALWAYS close a connection!
} catch (Exception ex) { Console.WriteLine(ex.Message); }
}
}
}ADO.NET, Dietrich Birngruber, TechTalk 13
IDbConnection Interface
z IDataReader ExecuteReader(...)
– Property CommandText only contains SQL SELECT statements
z int ExecuteNonQuery()
– Property CommandText contains INSERT, UPDATE, DELETE, ...
cmd.CommandText = "UPDATE Empls SET City = ’Seattle’ WHERE lD=8";
int affectedRows = cmd.ExecuteNonQuery();
z object ExecuteScalar()
– Property CommandText contains SQL aggregate functions
IDbCommand cmd = new SqlCommand("SELECT count(*) FROM Empls",
new SqlConnection(connStr));
cmd.Connection.Open();
int count = (int) cmd.ExecuteScalar();
cmd.Connection.Close();
z Part I: Basics
z Part II: Connection-Oriented Scenario
z Part III: Disconnected Scenario
z Part IV: Data Access Layer Sample
.NET
ADO
Data access
Smart sources
components
Clients
Web & application server (remote)
access
ADO.NET, Dietrich Birngruber, TechTalk 21
Zoom In: N-Tier Client/Server Architecture
Business Logic / Data Access Logic Data
Sources
DataSet DataAdapter
IDataReade r
IDbTransactio n, IDb Co nnection
DataTableCollection Fill SelectCommand select Database
DataRowCollection ParameterColl.
DataTable
DataColumnCollection
„Person“ InsertCommand insert
ConstraintCollection
DataTable ParameterColl. Person
Update
„Contact“ UpdateCommand update Contact
ParameterColl.
DataRelationCollection
DeleteCommand delete
ParameterColl.
ReadXml
WriteXml
DataSet
DataTable
DataTable Schema
.Tables[...]
.Columns[..]
.Columns[...] DataColumn DataColumn
.Rows[...]
.Rows[..] DataRow
Data
DataRow
.DefaultView DataView
...
.Relations[...]
DataRelation
DataRelation
...
ADO.NET, Dietrich Birngruber, TechTalk 23
Example: Contacts
Concept Implementation
„PersonHasContacts“
FirstName FirstName DataColumn „FirstName“ DataColumn „FirstName“
DataRelation
Name Name DataColumn „Name“ DataColumn „Name“
DataSet LoadData() {
//----- define SELECT commands
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = new OleDbConnection ("provider=SQLOLEDB; " +
" data source=(local)\\NetSDK; database=netbook; user id=sa; password=;" );
cmd.CommandText = "SELECT * FROM Person; SELECT * FROM Contact";
)
ADO.NET, Dietrich Birngruber, TechTalk 25
Beispiel: Kontaktliste (3)
if (ds.HasErrors) {
ds.RejectChanges();
} else {
DefineRelation(ds); //... or read schema information from the data source
ds.AcceptChanges();
}
if (adapter is IDisposable) ((IDisposable)adapter).Dispose();
return ds;
}
z Part I: Basics
z Part II: Connection-Oriented Scenario
z Part III: Disconnected Scenario
z Part IV: Data Access Layer Sample
OO Relational
z Root Inheritance
– NO hierarchy Class A A1 | A2
„1“ | „2“
– Only objects of type „A“
z Shared Inheritance
– All instances in one table Class A A1 | A2 | B1 | TID
– Type discriminator „1“| „2“|null| A
Class B „1“| „4“| „3“ | B
– null values in DB,
but fast read access
z Joined Inheritance
Class A A1 | A2 | ID B1| A_ID
– 1 type == 1 table
„1“| „2“| A1 „3“| A2
– Hierarchy == relation (SQL joins) Class B „1“| „4“| A2
z Connection-oriented scenario
– Always current data
– Low number of concurrent data accesses
– Many write access situations
– IDbConnection, IDbCommand, IDataReader
z Disconnected scenario
– Modifications in DataSet ≠ modifications in the data source
– Many concurrent read access situations
– DataSet, DataTable, DbDataAdapter
z DAL example
– Generative programming approach
– Bridges the gap between OO world and relational world
ADO.NET, Dietrich Birngruber, TechTalk 31
Questions + Contact
http://dotnet.jku.at
http://www.ssw.uni-linz.ac.at
http://www.techtalk.at
birngruber@acm.org