Download - Oracle & SQL Server in a.NET World Silvano Coriani ([email protected] Developer Evangelist Microsoft Silvano Coriani ([email protected].

Transcript
Page 1: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

Oracle & SQL Server in a .NET World

Silvano Coriani ([email protected] EvangelistMicrosoft

Page 2: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

AgendaAgenda

Il miglior RDBMS per .NET Microsoft SQL Server 2005

Ok, ok…viviamo in un mondo “meticcio” Oracle 8i/9i/10g (10.1.0,10.2.0)IBM DB2 UDB 8.2.2

.NET DevelopmentProblemi simili, ambienti e soluzioni diverseBest practices e dintorni

Il miglior RDBMS per .NET Microsoft SQL Server 2005

Ok, ok…viviamo in un mondo “meticcio” Oracle 8i/9i/10g (10.1.0,10.2.0)IBM DB2 UDB 8.2.2

.NET DevelopmentProblemi simili, ambienti e soluzioni diverseBest practices e dintorni

Page 3: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

RDBMS su WindowsRDBMS su Windows

Intendiamoci… Microsoft SQL Server 2005 è il miglior RDBMS su Windows

Miglior TPC-C su hw commerciale (x86-IA64)Migliori risultati su 2-4-6 processori (x86)Ha il Query Processor più evolutoMiglior integrazione con la piattaforma di sviluppoSemplicità di gestione

“Auto-everything” da sempre

News con la versione 2005Uno Storage Engine all’altezza di qualsiasi confrontoNuovi servizi integrati come il Broker, Notifications, ecc.

Intendiamoci… Microsoft SQL Server 2005 è il miglior RDBMS su Windows

Miglior TPC-C su hw commerciale (x86-IA64)Migliori risultati su 2-4-6 processori (x86)Ha il Query Processor più evolutoMiglior integrazione con la piattaforma di sviluppoSemplicità di gestione

“Auto-everything” da sempre

News con la versione 2005Uno Storage Engine all’altezza di qualsiasi confrontoNuovi servizi integrati come il Broker, Notifications, ecc.

Page 4: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

RDBMS su WindowsRDBMS su WindowsMa non siamo soli… Oracle, dalla 8i alla 10g (10.2.0)

Pro (cosa gli invidio)La reputazione e il know howLo storage engine

ControQuery Proc “solido” ma non particolarmente smartCosti licenze comunque elevati, e componenti aggiuntive a pagamentoComplessità di gestione (capacity planning, installazione, tuning, amministrazione)

IBM DB 2Pro

Query proc decisamente interessanteIl TPC-C benchmark su AIX e POWER5

ControVersioni differenti sulle diverse piattaforme

Funzionalità, comportamenti, modelli di programmazioneStrumenti di gestione “incoerenti”Servizi poco integrati tra di loro

Ma non siamo soli… Oracle, dalla 8i alla 10g (10.2.0)

Pro (cosa gli invidio)La reputazione e il know howLo storage engine

ControQuery Proc “solido” ma non particolarmente smartCosti licenze comunque elevati, e componenti aggiuntive a pagamentoComplessità di gestione (capacity planning, installazione, tuning, amministrazione)

IBM DB 2Pro

Query proc decisamente interessanteIl TPC-C benchmark su AIX e POWER5

ControVersioni differenti sulle diverse piattaforme

Funzionalità, comportamenti, modelli di programmazioneStrumenti di gestione “incoerenti”Servizi poco integrati tra di loro

Page 5: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

RDBMS su WindowsRDBMS su Windows

Ma in Oracle si fa…. come faccio in SQL Server?

Nello Storage Engine di SQL Server 2005 ci sono novità per i DEV che utilizzano normalmente Oracle

Snapshot Isolation (e Read Committed S.I.)Data & index partitioning

È stato aggiunta la funzione ROW_NUMBER() per numerare i record di un resultset (evvai con le paginazioni!) Altre tecniche di programmazione tipiche del mondo Oracle possono essere facilmente imitate con SQL Server

Ad esempio le famigerate Sequence

Ma in Oracle si fa…. come faccio in SQL Server?

Nello Storage Engine di SQL Server 2005 ci sono novità per i DEV che utilizzano normalmente Oracle

Snapshot Isolation (e Read Committed S.I.)Data & index partitioning

È stato aggiunta la funzione ROW_NUMBER() per numerare i record di un resultset (evvai con le paginazioni!) Altre tecniche di programmazione tipiche del mondo Oracle possono essere facilmente imitate con SQL Server

Ad esempio le famigerate Sequence

Page 6: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

Estendere il DBMS “dall’interno” con .NETEstendere il DBMS “dall’interno” con .NET

SQL Server 2005 integra il CLR per estendere il DBMSSia Oracle che DB2 consentono l’utilizzo di estendere il motore relazionale con il codice managed, in modalità diverseUtilizzano la v1.1 del CLRIntegrazione molto diversa rispetto a SQL Server 2005

Semplice hosting attraverso le interfacce COM del CLRNessun utilizzo degli host attributes della v2.0 per garantire la stabilità dell’hoster (utilizzo delle risorse, gestione eccezzioni, ecc.)

SQL Server 2005 integra il CLR per estendere il DBMSSia Oracle che DB2 consentono l’utilizzo di estendere il motore relazionale con il codice managed, in modalità diverseUtilizzano la v1.1 del CLRIntegrazione molto diversa rispetto a SQL Server 2005

Semplice hosting attraverso le interfacce COM del CLRNessun utilizzo degli host attributes della v2.0 per garantire la stabilità dell’hoster (utilizzo delle risorse, gestione eccezzioni, ecc.)

Es. Oracle CLR Host

Page 7: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

Windows Development Environment SupportWindows Development Environment Support

Visual StudioEnvironment

IIS

Oracle Developer Oracle Developer Tools for VS.NETTools for VS.NET

C++, C#, VB .NET

Application

Develop

ODP.NETODP.NET

Deploy

Oracle DB Oracle DB Extensions Extensions

For .NETFor .NET

IIS(ASP

ASP.NET)

MTS/COM+

Application

Deploy

Oracle Services for MTSOracle Services for MTS

Database Development

Page 8: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

Sviluppare applicazioni “client” con .NETSviluppare applicazioni “client” con .NET

Strumenti.NET Data Providers di Microsoft, Oracle e IBMOracle Developer Tools for Visual Studio .NETIBM DB2 Tools for Visual Studio .NET

Reusable codeEnterprise LibraryData Access Application Blocks

OracleDB2

Problemi apertiDifferenti dialetti SQL

Ma standard ANSI-SQL 92 più o meno rispettatoDifferenti funzionalità

Sequence, Locking model, Stored Proc, supporto XML, ecc. ecc.

Strumenti.NET Data Providers di Microsoft, Oracle e IBMOracle Developer Tools for Visual Studio .NETIBM DB2 Tools for Visual Studio .NET

Reusable codeEnterprise LibraryData Access Application Blocks

OracleDB2

Problemi apertiDifferenti dialetti SQL

Ma standard ANSI-SQL 92 più o meno rispettatoDifferenti funzionalità

Sequence, Locking model, Stored Proc, supporto XML, ecc. ecc.

Page 9: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

Oracle e .NET sul clientOracle e .NET sul client

Microsoft .NET Data Provider per OracleProdotto da MicrosoftUsa gli strumenti client di Oracle

Oracle Data Provider per .NET (ODP.NET)Sviluppato da OracleIntegrazione completaEspone tutte le caratteristiche di un Oracle DB

Oracle Connect per .NET (DataDirect)Altri metodi di accesso

OLE DB .NET via OLE DBODBC .NET via ODBC

Microsoft .NET Data Provider per OracleProdotto da MicrosoftUsa gli strumenti client di Oracle

Oracle Data Provider per .NET (ODP.NET)Sviluppato da OracleIntegrazione completaEspone tutte le caratteristiche di un Oracle DB

Oracle Connect per .NET (DataDirect)Altri metodi di accesso

OLE DB .NET via OLE DBODBC .NET via ODBC

Page 10: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

ODP.NET BasicsODP.NET Basics

Disponibile gratuitamente.NET Developer Centerhttp://www.oracle.com/technology/tech/dotnet/index.html

Può essere usato con Oracle8, Oracle8i, Oracle9i, e Oracle10gIl database server può essere su Unix, Linux, Windows, etc.Client basato su .NET

Supporta VS.NET 2002 e 2003Supporta .NET Framework 1.0 e 1.1

Disponibile gratuitamente.NET Developer Centerhttp://www.oracle.com/technology/tech/dotnet/index.html

Può essere usato con Oracle8, Oracle8i, Oracle9i, e Oracle10gIl database server può essere su Unix, Linux, Windows, etc.Client basato su .NET

Supporta VS.NET 2002 e 2003Supporta .NET Framework 1.0 e 1.1

Page 11: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

.NET Data Providers.NET Data Providers

Page 12: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

ODP.NETODP.NET

DataSet OracleDataAdapter

OracleTransaction

OracleCommand

OracleConnection

OracleDataReader

Layer Connesso(ODP.NET)

LayerDisconnesso

Oracle

OracleCommandBuilder

Dati

Page 13: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

ODP.NETODP.NET

Supporto completo a PL/SQLPackaged, non-packaged, anonymous, autonomous

*Batch SQL disponibile con anonymous PL/SQL

Data type nativi OracleLOBS, REF Cursors, BFiles, N-data types, Dates, TimeStamps, Longs, Raws, etc.

Mapping con tipi .NET

*Connection poolingMin, Max, Timeout, Lifetime, Increment, Decrement

Supporto completo a PL/SQLPackaged, non-packaged, anonymous, autonomous

*Batch SQL disponibile con anonymous PL/SQL

Data type nativi OracleLOBS, REF Cursors, BFiles, N-data types, Dates, TimeStamps, Longs, Raws, etc.

Mapping con tipi .NET

*Connection poolingMin, Max, Timeout, Lifetime, Increment, Decrement

Page 14: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

Integrazione con Visual Studio .NETIntegrazione con Visual Studio .NET

Dynamic HelpDocumentazione ODP.NET – F1 key

Server ExplorerTables, views, e synonyms

Query e view designer

Stored procedures, functions, triggers, package bodies, package specifications

Execute, create, delete

IntellisenseDrag-and-drop da Data toolbox

Dynamic HelpDocumentazione ODP.NET – F1 key

Server ExplorerTables, views, e synonyms

Query e view designer

Stored procedures, functions, triggers, package bodies, package specifications

Execute, create, delete

IntellisenseDrag-and-drop da Data toolbox

Page 15: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

.NET e Oracle.NET e Oracle

ADO.NETODBC.NETOleDBOracleODP.NET

VS.NET 2003ASP.NET Web Services

ADO.NETODBC.NETOleDBOracleODP.NET

VS.NET 2003ASP.NET Web Services

Page 16: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

Usare ADO.NET con OracleUsare ADO.NET con Oracle Imports System.Data

Imports System.Data.OracleClient

Sub Main() Dim conn as New OracleConnection() conn.ConnectionString = _ "data source=zzz;" & _ "user id=scott;password=tiger" Try conn.Open() Console.WriteLine("Hello Oracle") Catch e as Exception Console.WriteLine("Failed connect") Finally If conn.State = _ ConnectionState.Open Then conn.Close() End If conn.Dispose() End Try End Sub

Imports System.DataImports System.Data.OracleClient

Sub Main() Dim conn as New OracleConnection() conn.ConnectionString = _ "data source=zzz;" & _ "user id=scott;password=tiger" Try conn.Open() Console.WriteLine("Hello Oracle") Catch e as Exception Console.WriteLine("Failed connect") Finally If conn.State = _ ConnectionState.Open Then conn.Close() End If conn.Dispose() End Try End Sub

Sub UseDataReader() Dim conn as New OracleConnection() conn.ConnectionString = _ "data source=symbolicname;" & _ "user id=scott;password=tiger" Dim cmd As New OracleCommand( _ "select * from emp", conn) Dim rdr As OracleDataReader

Try conn.Open() rdr = cmd.ExecuteReader() While rdr.Read = True Console.WriteLine( _ "empno = {0}, ename = {1}", _ rdr("empno"), rdr("ename")) End While Catch e As Exception Console.WriteLine(e.Message) Finally

If conn.State = _ ConnectionState.Open Then conn.Close() End If cmd.Dispose() conn.Dispose() End Try End Sub

Page 17: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

Oracle e i DataSetOracle e i DataSet

Sub UseDataSet() Dim ds As New DataSet() Dim da As New OracleDataAdapter( _ "select * from emp", _ "data source=zvm43;" & _ "user id=tiger;password=tiger") Dim bld As New OracleCommandBuilder(da) Try da.Fill(ds, "emp") Dim r As DataRow For Each r In ds.Tables(0).Rows Console.WriteLine( _ "empno = {0}, ename = {1}", _ r("empno"), r("ename")) Next

' Change a row and call Update ds.Tables(0).Rows(0)(2) = "JONES" da.Update(ds, "emp") Catch e As Exception Console.WriteLine(e.Message) End Try End Sub

Sub UseDataSet() Dim ds As New DataSet() Dim da As New OracleDataAdapter( _ "select * from emp", _ "data source=zvm43;" & _ "user id=tiger;password=tiger") Dim bld As New OracleCommandBuilder(da) Try da.Fill(ds, "emp") Dim r As DataRow For Each r In ds.Tables(0).Rows Console.WriteLine( _ "empno = {0}, ename = {1}", _ r("empno"), r("ename")) Next

' Change a row and call Update ds.Tables(0).Rows(0)(2) = "JONES" da.Update(ds, "emp") Catch e As Exception Console.WriteLine(e.Message) End Try End Sub

Page 18: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

Query parametricheQuery parametriche“Select * from emp where empno > ?”(ODBC,OleDB,DataDirect)“Select * from emp where empno > @enumber”(System.Data.SqlClient)“Select * from emp where empno > :enumber”(System.Data.OracleClient)

“Select * from emp where empno > ?”(ODBC,OleDB,DataDirect)“Select * from emp where empno > @enumber”(System.Data.SqlClient)“Select * from emp where empno > :enumber”(System.Data.OracleClient)

Sub UseParmQuery() Dim conn As New OracleConnection( _ "data source=zmv43;" & _ "user id=scott;password=tiger") Dim cmd As New OracleCommand( _ "select * from emp " & _ "where empno > :thenumber", conn)

cmd.Parameters.Add("thenumber", 7000)Dim rdr As OracleDataReader

Try conn.Open() rdr = cmd.ExecuteReader() While rdr.Read = True Console.WriteLine( _ "empno = {0}, ename = {1}", _ rdr("empno"), rdr("ename")) End While Catch e As Exception Console.WriteLine(e.Message) Finally If conn.State = _ ConnectionState.Open Then conn.Close() End If cmd.Dispose() conn.Dispose() End Try End Sub

Page 19: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

Funzionalità specifiche ODP.NETFunzionalità specifiche ODP.NET Stessi nomi di

classi dei provider Microsoft e DataDirectOttimizzazioni sulle connessioniGestione dei Savepoint nelle transazioni locali e distribuiteREF CURSORsBLOB, CLOB, BFILE

Stessi nomi di classi dei provider Microsoft e DataDirectOttimizzazioni sulle connessioniGestione dei Savepoint nelle transazioni locali e distribuiteREF CURSORsBLOB, CLOB, BFILE

Page 20: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

REF CURSOR come ResultsetREF CURSOR come Resultset

OracleConnection conn = new OracleConnection( "data source=zmv43;user id=scott;password=tiger");OracleCommand cmd = new OracleCommand("Employes.GetEmpRecords", conn);cmd.CommandType = CommandType.StoredProcedure; conn.Open();

cmd.Parameters.Add("p_cursor", OracleDbType.RefCursor); cmd.Parameters.Add("j_cursor", OracleDbType.RefCursor); cmd.Parameters.Add("indeptno", OracleDbType.Decimal); cmd.Parameters.Add("p_errorcode", OracleDbType.Int32);

cmd.Parameters[0].Direction = ParameterDirection.Output; cmd.Parameters[1].Direction = ParameterDirection.Output; cmd.Parameters[2].Value = 10; cmd.Parameters[3].Direction = ParameterDirection.Output;

OracleDataReader rdr = cmd.ExecuteReader(); // fetch output parm Console.WriteLine(cmd.Parameters[3].Value); do { while (rdr.Read()) Console.WriteLine(rdr[0]); } while (rdr.NextResult() == true);

OracleConnection conn = new OracleConnection( "data source=zmv43;user id=scott;password=tiger");OracleCommand cmd = new OracleCommand("Employes.GetEmpRecords", conn);cmd.CommandType = CommandType.StoredProcedure; conn.Open();

cmd.Parameters.Add("p_cursor", OracleDbType.RefCursor); cmd.Parameters.Add("j_cursor", OracleDbType.RefCursor); cmd.Parameters.Add("indeptno", OracleDbType.Decimal); cmd.Parameters.Add("p_errorcode", OracleDbType.Int32);

cmd.Parameters[0].Direction = ParameterDirection.Output; cmd.Parameters[1].Direction = ParameterDirection.Output; cmd.Parameters[2].Value = 10; cmd.Parameters[3].Direction = ParameterDirection.Output;

OracleDataReader rdr = cmd.ExecuteReader(); // fetch output parm Console.WriteLine(cmd.Parameters[3].Value); do { while (rdr.Read()) Console.WriteLine(rdr[0]); } while (rdr.NextResult() == true);

Page 21: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

ExecuteNonQuery e REF CURSORSExecuteNonQuery e REF CURSORS

// Connection and parameter setup as above ... int i = cmd.ExecuteNonQuery();

// cast to obtain both REF CURSORs as DataReadersOracleDataReader rdr1 = ((OracleRefCursor)cmd.Parameters[0].Value).GetDataReader();

OracleDataReader rdr2 = ((OracleRefCursor)cmd.Parameters[1].Value).GetDataReader();

// use both REF CURSORs at the same time while ((rdr1.Read()) && (rdr2.Read())) { Console.WriteLine(rdr1.GetName(0) + " = " + rdr1[0]);

Console.WriteLine(rdr2.GetName(0) + " = " + rdr2[0]); }

// Connection and parameter setup as above ... int i = cmd.ExecuteNonQuery();

// cast to obtain both REF CURSORs as DataReadersOracleDataReader rdr1 = ((OracleRefCursor)cmd.Parameters[0].Value).GetDataReader();

OracleDataReader rdr2 = ((OracleRefCursor)cmd.Parameters[1].Value).GetDataReader();

// use both REF CURSORs at the same time while ((rdr1.Read()) && (rdr2.Read())) { Console.WriteLine(rdr1.GetName(0) + " = " + rdr1[0]);

Console.WriteLine(rdr2.GetName(0) + " = " + rdr2[0]); }

Page 22: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

ODP.NET e XMLODP.NET e XML

*XMLXMLType data typeQuery XML dal DB

Sia su tabelle relazionali che object-relational

Interoperabilità con MS XML API (es. XmlReader)Supporta XSLT e XPATH

*XMLXMLType data typeQuery XML dal DB

Sia su tabelle relazionali che object-relational

Interoperabilità con MS XML API (es. XmlReader)Supporta XSLT e XPATH

* Performance tip

Page 23: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

ODP.NET e XMLODP.NET e XML

Richiede Oracle8i, Oracle9i, o Oracle 10g DB

Può richiedere XML Developer’s Kits (XDK) sul server

XML DBNon è indispensabile ma raccomandatoDisponibilità di OracleXmlTypePossibilità di utilizzare Schema XML

Richiede Oracle8i, Oracle9i, o Oracle 10g DB

Può richiedere XML Developer’s Kits (XDK) sul server

XML DBNon è indispensabile ma raccomandatoDisponibilità di OracleXmlTypePossibilità di utilizzare Schema XML

Page 24: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

Classi ODP.NET XMLClassi ODP.NET XML

OracleXmlTypeDati XMLType nativi

OracleXmlStreamStream XML read-only

OracleXmlQueryPropertiesOracleXmlSaveProperties

OracleXmlTypeDati XMLType nativi

OracleXmlStreamStream XML read-only

OracleXmlQueryPropertiesOracleXmlSaveProperties

Page 25: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

ODP.NETODP.NET

TransazioniUtilizzo degli Enterprise Services via Oracle Services for MTS

Locali (Implicite e esplicite)

Savepoints

GlobalizationSupporto completo a Unicode

Utilizzo delle impostazioni internazionali dei client

Transparent application failoverCallback di notifica

TransazioniUtilizzo degli Enterprise Services via Oracle Services for MTS

Locali (Implicite e esplicite)

Savepoints

GlobalizationSupporto completo a Unicode

Utilizzo delle impostazioni internazionali dei client

Transparent application failoverCallback di notifica

* Performance tip

Page 26: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

Best Practice - ConnectionBest Practice - Connection

Utilizzare il connection poolingMa attenzione al numero di connessioni nel pool (nell’ultima versione di ODP.NET abbiamo pieno controllo)

Attenzione alle stringe di connessioneNon generare pool differenti

Utilizzare forme di autenticazione “proxy”

Utilizzare il connection poolingMa attenzione al numero di connessioni nel pool (nell’ultima versione di ODP.NET abbiamo pieno controllo)

Attenzione alle stringe di connessioneNon generare pool differenti

Utilizzare forme di autenticazione “proxy”

Page 27: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

Best Practice - ConnectionBest Practice - Connection

Validate ConnectionGarantisce una connessione valida, ma al prezzo di un extra round tripForse meglio crearsi il proprio exception handler

Utilizzare correttamente gli oggetti ODP.NET (e.g. OracleConnection)

Chiamare Dispose() quando non più utilizzati

Validate ConnectionGarantisce una connessione valida, ma al prezzo di un extra round tripForse meglio crearsi il proprio exception handler

Utilizzare correttamente gli oggetti ODP.NET (e.g. OracleConnection)

Chiamare Dispose() quando non più utilizzati

Page 28: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

Best Practice – Letture e aggiornamentiBest Practice – Letture e aggiornamenti

Concetto base: controllare i roundtrip verso il database

Recuperare solo i dati necessari, solo quando necessario

SELECTUsare FetchSize (OracleDataReader) e RowSize (OracleCommand) per controllare la dimensione dei dati ritornatiUtilizzare DataAdapter Requery

Evita DB round trip

Concetto base: controllare i roundtrip verso il database

Recuperare solo i dati necessari, solo quando necessario

SELECTUsare FetchSize (OracleDataReader) e RowSize (OracleCommand) per controllare la dimensione dei dati ritornatiUtilizzare DataAdapter Requery

Evita DB round trip

Page 29: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

Best Practice – Letture e aggiornamentiBest Practice – Letture e aggiornamenti

Multi-statement (in un roundtrip)Eseguire più statement batch differenti

Attraverso anonymous PL/SQLUnico roundtrip, resultset differenti

Stesso set di comanti più volte?Utilizzare statement caching

Riutilizzo di comandi SQL o PL/SQLOk anche quando il valore dei parametri cambia

Multi-statement (in un roundtrip)Eseguire più statement batch differenti

Attraverso anonymous PL/SQLUnico roundtrip, resultset differenti

Stesso set di comanti più volte?Utilizzare statement caching

Riutilizzo di comandi SQL o PL/SQLOk anche quando il valore dei parametri cambia

Page 30: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

Best Practice – Letture e aggiornamentiBest Practice – Letture e aggiornamenti

Multi-statementEseguire lo stesso comando più volte?

Utilizzare il parameter array binding Il comando verrà eseguito una volta per ogni valore dell’array, ma in un unico roundtripLimitazioni nell’utilizzo di SELECT statement, tipicamente adatto ad operazioni di insert/update

Passare un array?Utilizzare gli array associativi di PL/SQL

Il comando verrà eseguito una sola volta per l’intero arrayOk anche per comandi di SELECT

Parameter array bindingPiù semplice degli array associativiMa gli array associativi hanno migliori performance e funzionalità avanzate

Multi-statementEseguire lo stesso comando più volte?

Utilizzare il parameter array binding Il comando verrà eseguito una volta per ogni valore dell’array, ma in un unico roundtripLimitazioni nell’utilizzo di SELECT statement, tipicamente adatto ad operazioni di insert/update

Passare un array?Utilizzare gli array associativi di PL/SQL

Il comando verrà eseguito una sola volta per l’intero arrayOk anche per comandi di SELECT

Parameter array bindingPiù semplice degli array associativiMa gli array associativi hanno migliori performance e funzionalità avanzate

Page 31: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

Best Practice –Data TypeBest Practice –Data Type

Concetto base: controllare i roundtripUtilizzare I tipi esposti da ODP.NET (es. OracleClob)Utilizzare OracleRefCursor

Recupero dei dati solo quando necessario

Utilizzare Oracle LOB (DML)No roundtrip aggiuntivi per aggiornare o inserire LOB

Concetto base: controllare i roundtripUtilizzare I tipi esposti da ODP.NET (es. OracleClob)Utilizzare OracleRefCursor

Recupero dei dati solo quando necessario

Utilizzare Oracle LOB (DML)No roundtrip aggiuntivi per aggiornare o inserire LOB

Page 32: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

Best Practice –Data TypeBest Practice –Data Type

Usare Oracle LOB (SELECT)Devo leggere tutto il LOB?

InitialLOBFetchSize e InitialLongFetchSize per controllare l’attività

Devo leggerne solo una parte?Proprietà Read per controllare la quantità di dati letti per roundtrip

Devo leggere il contenuto successivamente?

Di default, ODP.NET LOBs utilizzano puntatori agli oggetti sul server e non necessitano di rileggere interamente gli oggetti

Usare Oracle LOB (SELECT)Devo leggere tutto il LOB?

InitialLOBFetchSize e InitialLongFetchSize per controllare l’attività

Devo leggerne solo una parte?Proprietà Read per controllare la quantità di dati letti per roundtrip

Devo leggere il contenuto successivamente?

Di default, ODP.NET LOBs utilizzano puntatori agli oggetti sul server e non necessitano di rileggere interamente gli oggetti

Page 33: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

ApprofondimentiApprofondimenti

.NET Developer Centerhttp://www.oracle.com/technology/tech/dotnet/index.html

Portale Oracle su Windowshttp://www.oracle.com/technology/tech/windows/index.html

.NET Developer Centerhttp://www.oracle.com/technology/tech/dotnet/index.html

Portale Oracle su Windowshttp://www.oracle.com/technology/tech/windows/index.html

Page 34: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

.NET e la famiglia DB2.NET e la famiglia DB2DB2 for DB2 for

zOSzOS

DB2 for DB2 for VSE & VMVSE & VM

DB2 for DB2 for iSeriesiSeries

DB2 DB2 EveryplaceEveryplace

DB2DB2(Windows (Windows & Linux)& Linux)

DB2DB2(partitioned (partitioned

across a cluster)across a cluster)

DB2 DB2 (Linux for (Linux for zSeries)zSeries)

DB2DB2(Linux for iSeries)(Linux for iSeries)

.NET .NET ApplicationApplication

Page 35: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

DB2 e ADO.NET sul clientDB2 e ADO.NET sul client

ODBC .Net Data ODBC .Net Data ProviderProvider

OdbcConnectionOdbcConnection

OdbcCommandOdbcCommand

OdbcDataAdapterOdbcDataAdapter

OdbcDataReaderOdbcDataReader

OLE DB .Net OLE DB .Net Data ProviderData Provider

OleDbConnectionOleDbConnection

OleDbCommandOleDbCommand

OleDbAdapterOleDbAdapter

OleDbDataReaderOleDbDataReader

DB2 .Net Data DB2 .Net Data ProviderProvider

DB2ConnectionDB2Connection

DB2CommandDB2Command

DB2DataAdapterDB2DataAdapter

DB2DataReaderDB2DataReader

IBM DB2 ODBC IBM DB2 ODBC DriverDriver

IBM DB2 OLE IBM DB2 OLE DB ProviderDB Provider

ApplicationApplicationSystem.Data.OleDbSystem.Data.OleDb

ApplicationApplicationMicrosft.Data.ODBCMicrosft.Data.ODBC

ApplicationApplicationIBM.Data.DB2IBM.Data.DB2

DB2DB2

Page 36: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

Data Provider per DB2Data Provider per DB2

ODBC .NET Data ProviderPer .NET Framework v1.0:

Namespace = Microsoft.Data.Odbc download from MSDN

per .NET Framework v1.1:Namespace = System.Data.Odbc

OLE DB .NET Data ProviderNamespace = System.Data.Oledb

IBM DB2 .NET Data ProviderNamespace = IBM.Data.DB2Parte del DB2 Run-Time Client V8.1.2

ODBC .NET Data ProviderPer .NET Framework v1.0:

Namespace = Microsoft.Data.Odbc download from MSDN

per .NET Framework v1.1:Namespace = System.Data.Odbc

OLE DB .NET Data ProviderNamespace = System.Data.Oledb

IBM DB2 .NET Data ProviderNamespace = IBM.Data.DB2Parte del DB2 Run-Time Client V8.1.2

Page 37: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

Modalità disconnessaModalità disconnessa

DB2DB2

DB2DB2

OtherOther

SQLSQLServerServer

DataSetDataSet

TableTable

TableTable

TableTable

TableTable

TableTable

Data AdapterData Adapter

Data AdapterData Adapter

Data AdapterData Adapter

Data AdapterData Adapter

Data AdapterData Adapter

WinFormWinForm

WebFormWebForm

MobileMobileWebFormWebForm

System.DataSystem.DataIBM.Data.DB2IBM.Data.DB2

Page 38: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

DB2Connection ObjectDB2Connection Object

Supporto per connection poolingPuò partecipare a transazioni distribuiteRicordarsi di chiudere la connessione quando finito il lavoro!!!

Supporto per connection poolingPuò partecipare a transazioni distribuiteRicordarsi di chiudere la connessione quando finito il lavoro!!!' set a connection string and connect to SAMPLE database' using DB2 .NET Data ProviderDim connectionString = "Database=SAMPLE"Dim cnn As New DB2Connection(connectionString) cnn.Open() ' Use the connection in here… If cnn.State = ConnectionState.Open Then cnn.Close() End If

Page 39: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

DB2Command ObjectDB2Command Object

Per comandi SQL statements o stored procedureCommand Object:

ExecuteReader – ritorna un DataReader ExecuteNonQuery – non ritorna nulla ExecuteScalar – ritorna il primo valore scalare

Per comandi SQL statements o stored procedureCommand Object:

ExecuteReader – ritorna un DataReader ExecuteNonQuery – non ritorna nulla ExecuteScalar – ritorna il primo valore scalare

' create a DB2Command with a SELECT statement Dim db2SelectCommand As New IBM.Data.DB2.DB2Command() db2SelectCommand.CommandText = "Select * from Customers" db2SelectCommand.Connection = myDB2Connection

Page 40: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

DB2DataReader ObjectDB2DataReader Object

Cursore forward-only, read-onlySolo il record corrente in memoriaExecuteReaderChiudere per liberare la connessione

Cursore forward-only, read-onlySolo il record corrente in memoriaExecuteReaderChiudere per liberare la connessione

Dim cnn As New DB2Connection(conDB2ConnectionString) Dim strSQL As String = "SELECT * FROM Department" Dim cmd As New DB2Command(strSQL, cnn) Dim dr As DB2DataReader cnn.Open() dr = cmd.ExecuteReader(CommandBehavior.CloseConnection) Do While dr.Read lstDept.Items.Add(String.Format("{0}: {1}, {2}", _ dr(“DEPTNO"), dr(“DEPTNAME"), dr(“MGRNO"))) Loop dr.Close()

Page 41: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

Chiamare Stored ProcedureChiamare Stored Procedure

Attraverso l’oggetto CommandGestione dei parametriAttraverso l’oggetto CommandGestione dei parametri

Dim dr As DB2DataReader Dim cnn As New DB2Connection(conDB2ConnectionString) Dim cmd As New DB2Command(“SomeSP", cnn) cnn.Open() cmd.CommandType = CommandType.StoredProcedure Dim prm As DB2Parameter = _ cmd.Parameters.Add(“SomeParam", “Foo") dr = cmd.ExecuteReader() While dr.Read lstDemo.Items.Add(String.Format( _ "{0}: {1}", dr(0), dr(1))) End While

Page 42: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

DB2DataAdapterDB2DataAdapter

Gestisce la sincronizzazione attraverso i 4 command object:

SelectCommandUpdateCommandDeleteCommandInsertCommand

Riempie un DataSet (metodo Fill)Aggiornamento dei dati in DB2 (metodo Update)

Gestisce la sincronizzazione attraverso i 4 command object:

SelectCommandUpdateCommandDeleteCommandInsertCommand

Riempie un DataSet (metodo Fill)Aggiornamento dei dati in DB2 (metodo Update)

Page 43: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

Add-in per Visual Studio.NETAdd-in per Visual Studio.NET

IBM ExplorerIBM Projects (DB2 Database Project)DB2 SQL EditorDB2 .Net Data Provider toolsDynamic Help for DB2 Add-InsDB2 Tools menu Add-in

IBM ExplorerIBM Projects (DB2 Database Project)DB2 SQL EditorDB2 .Net Data Provider toolsDynamic Help for DB2 Add-InsDB2 Tools menu Add-in

Page 44: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

IBM Explorer: Data ConnectionIBM Explorer: Data Connection

Simile al Server Explorer per visualizzare gli oggetti in DB2Browsing dei datiDrag and drop degli oggetti e generazione del codice

Simile al Server Explorer per visualizzare gli oggetti in DB2Browsing dei datiDrag and drop degli oggetti e generazione del codice

Page 45: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

SQL EditorSQL Editor

Estensione dell’editor di VS.Net per editare script DDLSupporto per :

Sintassi colorata per DB2 SQLIntellisense e code completionGestione dei code fragments per il codice DML utilizzato più di frequente

Estensione dell’editor di VS.Net per editare script DDLSupporto per :

Sintassi colorata per DB2 SQLIntellisense e code completionGestione dei code fragments per il codice DML utilizzato più di frequente

Page 46: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

Tools Add-inTools Add-in

Toolbar per lanciare gli strumenti DB2 da Visual Studio.NET 2003

Development CenterControl CenterReplication CenterCommand CenterTask CenterHealth CenterJournal

Toolbar per lanciare gli strumenti DB2 da Visual Studio.NET 2003

Development CenterControl CenterReplication CenterCommand CenterTask CenterHealth CenterJournal

Page 47: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

ApprofondimentiApprofondimenti

Download DB2 Personal Developer’s Edition (free)Articoli e tutorial:

IBM DB2 Development Add-Ins for Visual Studio .NetDB2 Database Project for Visual Studio .NetCreating a .NET Client that Uses DB2 DADX Web ServicesCreating and Linking LOBs in a Data Application for Microsoft .Net using DB2 Universal Database

Download DB2 Personal Developer’s Edition (free)Articoli e tutorial:

IBM DB2 Development Add-Ins for Visual Studio .NetDB2 Database Project for Visual Studio .NetCreating a .NET Client that Uses DB2 DADX Web ServicesCreating and Linking LOBs in a Data Application for Microsoft .Net using DB2 Universal Database

Page 48: Oracle & SQL Server in a.NET World Silvano Coriani (silvano.coriani@microsoft.com Developer Evangelist Microsoft Silvano Coriani (silvano.coriani@microsoft.com.

RisorseRisorseSiti web

IBM DB2 Developer DomainDB2 for Windows home su developerWorksDB2 .NET home page

Newsgroupcomp.databases.ibm-db2news://news.software.ibm.com/ibm.software.db2.udb.betanews://news.software.ibm.com/ibm.software.db2.udb

Siti webIBM DB2 Developer DomainDB2 for Windows home su developerWorksDB2 .NET home page

Newsgroupcomp.databases.ibm-db2news://news.software.ibm.com/ibm.software.db2.udb.betanews://news.software.ibm.com/ibm.software.db2.udb