Oracle & SQL Server in a .NET World
Silvano Coriani ([email protected] EvangelistMicrosoft
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
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.
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
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
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
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
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.
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
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
.NET Data Providers.NET Data Providers
ODP.NETODP.NET
DataSet OracleDataAdapter
OracleTransaction
OracleCommand
OracleConnection
OracleDataReader
Layer Connesso(ODP.NET)
LayerDisconnesso
Oracle
OracleCommandBuilder
Dati
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
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
.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
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
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
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
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
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);
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]); }
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
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
Classi ODP.NET XMLClassi ODP.NET XML
OracleXmlTypeDati XMLType nativi
OracleXmlStreamStream XML read-only
OracleXmlQueryPropertiesOracleXmlSaveProperties
OracleXmlTypeDati XMLType nativi
OracleXmlStreamStream XML read-only
OracleXmlQueryPropertiesOracleXmlSaveProperties
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
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”
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
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
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
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
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
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
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
.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
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
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
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
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
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
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()
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
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)
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
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
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
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
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
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
Top Related