ado - .net at jkudotnet.jku.at/courses/tutorial/05.ado.net.pdf · ado.net, dietrich birngruber,...

32
ADO.NET Dietrich Birngruber Software Architect TechTalk www.techtalk.at

Upload: buitram

Post on 29-Mar-2018

221 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET

Dietrich Birngruber

Software ArchitectTechTalkwww.techtalk.at

Page 2: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 2

Contents

Part I: BasicsPart II: Connection-Oriented Scenario Part III: Disconnected ScenarioPart IV: Data Access Layer Sample

Page 3: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 3

Motivation

How to access different data sources?– „back office“, OO/RDBMS, files, (web-)server, ...

Is there a unified programming model and API available ?

Application(object-oriented)

Oracle implementation 1 Oracle

IBM HostIBM

implementation 2

?????? data access

implementation 3

Application(object-oriented)

Page 4: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 4

Microsoft Data Access Components

(.NET) Applications

ADO.NET

OLEDB

ODBC

data source specific

SQL data Non SQL data Mainframe and other proprietary

data sourcesMS SQL Server, Oracle, DB2, Jet, ...

Directory services, email, text files, ...

Page 5: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 5

Architectural OverviewA

DO

.NET

.NET Application

IDataReader

OleDbCommand XYCommand*

OLEDBMsSQL Server specific

Proprietary access protocol XY

Data Source (SQL Server, XML files, …)

data consumer

SQL

com

man

ds

data

data types of the data source

IDbCommand

.NET data types

DataSet

dataprovider SqlCommand

* ODBC, Oracle (v1.1)

Page 6: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 6

Connection Oriented Scenario

Connection to data source remains aliveIDataReader for reading

Scenarios with …– low number of concurrent accesses– short running transactions– data always up to date

Data accesslogic

data source

Application

Page 7: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 7

Disconnected Scenario

No permanent connection to the data sourceData is cached in DataSet

Modifications in DataSet ≠ modifications in the data source

Scenarios with …– a lot of concurrent, long running read accesses (e.g. web)

Application

DataSet(Buffer)

(Read)Access

data source

Page 8: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 8

Namespaces (System.Data.dll)

System.Data (basic types)System.Data.OleDb (OLEDB provider)System.Data.SqlClient (Microsoft SQL Server provider)System.Data.CommonSystem.Data.SqlTypesSystem.Data.Odbc (ODBC provider, since .NET 1.1)System.Data.OracleClient (Oracle provider, since .NET 1.1)System.Data.SqlServerCe (Compact Framework)

Extra download (prior to NET1.1):– Microsoft.Data.Odbc– System.Data.OracleClient

Page 9: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 9

Contents

Part I: BasicsPart II: Connection-Oriented ScenarioPart III: Disconnected ScenarioPart IV: Data Access Layer Sample

Page 10: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 10

Example: Northwind

Food & beverages merchant– Microsoft sample; part of MSDE (MS SQL Server)

Task: read table „Employees“Steps:1. Connect to database

(IDbConnection)2. Execute SQL command object

(IDbCommand)3. Read and compute

(IDataReader)4. Release resources

Page 11: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 11

Typical Program Structure

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; }

}

Page 12: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 12

Code: EmployeeReader

using System;using System.Data;using System.Data.OleDb;

public class EmployeeReader {public static void Main() {//----- Connect to local data basestring connStr = "provider=SQLOLEDB; data source=(local)\\NetSDK; " +

"initial catalog=Northwind; user id=sa; password=; ";IDbConnection con = null; // declare connection variabletry {con = new OleDbConnection(connStr);con.Open(); //open connection//----- Create command object and define SQL command textIDbCommand cmd = con.CreateCommand(); //creates an OleDbCommand objectcmd.CommandText = "SELECT EmployeeID, LastName, FirstName FROM Employees";

//next slide ...

1.)

Page 13: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 13

Code: EmployeeReader (2)

//....//----- execute command object; it returns an OleDbDataReaderIDataReader reader = cmd.ExecuteReader();object[] dataRow = new object[reader.FieldCount];//----- read data row by row ... forward only cursorwhile (reader.Read()) { int cols = reader.GetValues(dataRow); for (int i = 0; i < cols; i++) Console.Write("| {0} " , dataRow[i]);Console.WriteLine();

}//----- close reader and release resourcesreader.Close();

} catch (Exception e) { Console.WriteLine(e.Message);

} finally { try { if (con != null)

con.Close(); // ALWAYS close a connection!} catch (Exception ex) { Console.WriteLine(ex.Message); }

}}

}

2.)

3.)

4.)

4.)

Page 14: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 14

IDbConnection Interface

For creating a connection to a data source (see step 1. )...

public interface IDbConnection : IDisposable {//----- propertiesstring ConnectionString {get; set;}int ConnectionTimeout {get;}...//----- methodsIDbTransaction BeginTransaction();IDbTransaction BeginTransaction(IsolationLevel lvl);void Close();void Open();IDbCommand CreateCommand();...

}

Page 15: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 15

ConnectionString Property

Configures the connectionSemicolon separated list of key – value pairsE.g. OLEDB:

"provider=SQLOLEDB; data source=127.0.0.1\\NetSDK; initial catalog=Northwind; user id=sa; password=; "

"provider=Microsoft.Jet.OLEDB.4.0;data source=c:\bin\LocalAccess40.mdb;"

"provider=MSDAORA; data source=ORACLE8i7; user id=OLEDB;password=OLEDB;"

E.g. MS SQL Server:"data source=(local)\\NetSDK; initial catalog=Northwind; user id=sa; pooling=false; Integrated Security=SSPI; connection timout=20;"

Page 16: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 16

“Execute” Methods of IDbCommand Interface

For executing SQL commands (see step 2. ) …

IDataReader ExecuteReader(...)– Property CommandText only contains SQL SELECT statements

int ExecuteNonQuery()– Property CommandText contains INSERT, UPDATE, DELETE, ...

cmd.CommandText = "UPDATE Empls SET City = ’Seattle’ WHERE lD=8";int affectedRows = cmd.ExecuteNonQuery();

Page 17: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 17

“Execute” Methods of IDbCommand Interface

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();

Page 18: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 18

How To: Parameters And SQL Commands

1. Define formal parameters //here we use OLEDBOleDbCommand cmd = new OleDbCommand();cmd.CommandText = "DELETE FROM Empls WHERE EmployeeID = ?";cmd.Parameters.Add(new OleDbParameter("anID", OleDbType.BigInt));cmd.Connection = ...

2. Assign actual parameters and execute commandcmd.Parameters["anID"].Value = 1234; // or cmd.Parameters[0]cmd.ExecuteNonQuery();

Page 19: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 19

Contents

Part I: BasicsPart II: Connection-Oriented Scenario Part III: Disconnected ScenarioPart IV: Data Access Layer Sample

Page 20: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 20

Support for a Disconnected Scenario

For distributed (enterprise) applications– A lot of concurrent read accesses – Designed for an n-tier client/server architecture in mind– E.g.: web shop, product catalog

DataSet caches data– Database “snapshot" in memory– In memory representation of an XML data and schema

DataSet is independent of a data source – Location, including multiple data sources (database, XML file, …)

DataSet is used in .NET framework– ASP.NET, Web Services, Win Forms, ...

DataAdapter is used for synchronization with data sources

Page 21: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 21

N-Tier Client/Server Architecture

Presentation LogicClient Side Server Side

Business Logic Data Logic

Web browser

SmartClients

Web components

Business components & OO Domain Model

ASP.NET,.NET classes

Business logic components

Web server

Web & application server

Domain model components

Data access components A

DO

.NE

T

Web service facade Data

sources

(remote)access

Page 22: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 22

Zoom In: N-Tier Client/Server Architecture

DataAdapterDatabase

Person

Contact

DataSet

DataTableCollection

DataRelationCollection

ConstraintCollectionDataColumnCollectionDataRowCollectionDataTable

„Person“DataTable„Contact“

deleteDeleteCommandParameterColl.

UpdateCommandParameterColl.

InsertCommandParameterColl.

SelectCommandParameterColl.

select

insert

update

Fill

XML file

Data flow, disconnected scenario

Data flow, connected scenario

ReadXmlWriteXml

Update

IDat

aRea

der

IDbT

rans

actio

n, ID

bCon

nect

ion

Business Logic / Data Access Logic Data Sources

Page 23: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 23

New Data Types

DataSet

.Tables[...]

.Relations[...]

...

DataTable

.Columns[..]

.Rows[..]

DataTable

.Columns[...]

.Rows[...]

.DefaultView

...

DataRow

DataRowData

DataColumn

Schema

DataColumn

DataView

DataRelationDataRelation

Page 24: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 24

Example: Contacts

Person

ID

FirstName

Name

Contact

ID

FirstName

Name

NickName

Phone

EMail

PersonID

Concept Implementation

DataSet

DataTable „Person“ DataTable „Contact“

DataColumn „ID“

DataColumn „FirstName“

DataColumn „Name“

DataColumn „NickName“

DataColumn „EMail“

DataColumn „Phone“

DataColumn „PersonID“

DataColumn „ID“

DataColumn „FirstName“

DataColumn „Name“

DataRelation

„PersonHasC

ontacts“

TODO: to read data and fill a DataSetWe need a DbDataAdapter or an IDbDataAdapter– E.g.: OleDbDataAdapter, SqlDataAdapter, ...

Page 25: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 25

Beispiel: Kontaktliste (2)

DataSet LoadData() {//----- define SELECT commandsOleDbCommand 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";

DataSet ds = new DataSet("PersonContacts");IDbDataAdapter adapter = new OleDbDataAdapter();adapter.SelectCommand = cmd;//----- DataSet is empty and contains no DataTable objectsadapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;//----- Rename automatically created DataTable objectsadapter.TableMappings.Add("Table", "Person");adapter.TableMappings.Add("Table1", "Contact");//----- Read data and populate the DataSetadapter.Fill(ds);

Page 26: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 26

Beispiel: Kontaktliste (3)

if (ds.HasErrors) {ds.RejectChanges();

} else {DefineRelation(ds); //... or read schema information from the data sourceds.AcceptChanges();

}if (adapter is IDisposable) ((IDisposable)adapter).Dispose();return ds;

}

void DefineRelation(DataSet ds) {DataColumn parentCol = ds.Tables["Person"].Columns["ID"];DataColumn childCol = ds.Tables["Contact"].Columns["PersonID"];DataRelation rel = new DataRelation("PersonHasContacts",

parentCol, childCol);ds.Relations.Add(rel);

}

Page 27: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 27

Contents

Part I: BasicsPart II: Connection-Oriented Scenario Part III: Disconnected ScenarioPart IV: Data Access Layer Sample

Page 28: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 28

Example: Data Access Layer

Mismatch: object-oriented world vs. relational World– Objects, classes, inheritance, object graph, life-time, …– Row, tables, relation, constraints, joins, …

Goal: Mapping OO – relational world– Reusable domain model (classes)– Transparent persistency mechanism

Tool for developerObject Query Language– Set oriented and NO tables!– “Class” == type + all objects

Used in .NET projects at TechTalk

Page 29: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 29

Usage Scenario

1. Design and implement object-oriented domain model– Abstract classes, separate assembly (DLL)

2. Define mapping rules in XML file– Classes of the domain model tables in the relational data base

3. Generate separate mapping assembly (DLL) with a tool– Uses ADO.NET and contains SQL commands

4. Test and use generated files– With a tool and in your code

Page 30: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 30

Supported OO-Relational Mapping Strategies

Root Inheritance – NO hierarchy– Only objects of type „A“

Shared Inheritance– All instances in one table– Type discriminator– null values in DB,

but fast read access

Joined Inheritance– 1 type == 1 table– Hierarchy == relation (SQL joins)

Class A A1 | A2

Class A A1 | A2 | B1 | TID

Class B

„1“ | „2“

„1“| „2“|null| A

„1“| „4“| „3“ | B

Class A A1 | A2 | ID

Class B„1“| „2“| A1

B1| A_ID

„3“| A2

„1“| „4“| A2

RelationalOO

Page 31: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 31

Summary

Connection-oriented scenario– Always current data – Low number of concurrent data accesses– Many write access situations– IDbConnection, IDbCommand, IDataReader

Disconnected scenario– Modifications in DataSet ≠ modifications in the data source– Many concurrent read access situations– DataSet, DataTable, DbDataAdapter

DAL example– Generative programming approach– Bridges the gap between OO world and relational world

Page 32: ADO - .NET at JKUdotnet.jku.at/courses/tutorial/05.ado.net.pdf · ADO.NET, Dietrich Birngruber, TechTalk 4 Microsoft Data Access Components (.NET) Applications ADO.NET OLEDB ODBC

ADO.NET, Dietrich Birngruber, TechTalk 32

Questions + Contact

http://dotnet.jku.athttp://www.ssw.uni-linz.ac.athttp://www.techtalk.at

[email protected]