La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

1 / 70 ADO.NET, i Data Provider e l'architettura connessa Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet.

Presentazioni simili


Presentazione sul tema: "1 / 70 ADO.NET, i Data Provider e l'architettura connessa Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet."— Transcript della presentazione:

1 1 / 70 ADO.NET, i Data Provider e l'architettura connessa Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet MCDBA

2 2 / 70 Da dove iniziare...

3 3 / 70 Agenda

4 4 / 70.NET Data Access Overview

5 5 / 70.NET Application ODBC OLE DB Other DBMS Non-relationalsources OLE DB Provider SQL Server System.Data.SqlClientSystem.Data.OleDbSystem.Data.Oracle Oracle DataSet System.Data.Odbc

6 6 / 70.NET Data Provider System.Data

7 7 / 70.NET Data Provider connessaCommand

8 8 / 70.NET Data Provider DataAdapter DataReader

9 9 / 70 ADO.NET e SQL Server 2000

10 10 / 70 SqlClient.NET Data Provider

11 11 / 70 SqlClient Managed Provider Non utilizza direttamente i cursori server di SQL Server –Nel caso, occorrono comandi T-SQL espliciti (OPEN CURSOR, sp_cursor, sp_executesql ecc.) –Oppure utilizzare ADO 2.x attraverso COM Interop Permette di interagire con le funzionalità XML di SQL Server 2000 –ExecuteXmlReader()

12 12 / 70 SqlClient.NET Data Provider Object Model SqlConnection SqlCommand SqlParameterCollectionSqlDataReader SqlParameter System.Xml.XmlReader Object

13 13 / 70 SqlClient e il CLR Common Language Runtime SqlServer SqlClient TDSParser

14 14 / 70 Accesso ai dati nel database server

15 15 / 70 Query ad-hoc

16 16 / 70 Prepare / Execute PreparedSqlCommandPreparedSqlCommand

17 17 / 70 sp_executesql Alternativa valida alle stored procedureAlternativa valida alle stored procedure –Elimina la gestione lato server Se si vuole ottenere il riutilizzo del piano di esecuzione, anche qui occorre definire correttamente I parametri con il relativo tipoSe si vuole ottenere il riutilizzo del piano di esecuzione, anche qui occorre definire correttamente I parametri con il relativo tipo Eseguita in modalità RPCEseguita in modalità RPC –Più efficiente nellesecuzione sul server –Riutilizzo del piano di esecuzione della query exec sp_executesql NInsert T1 Values (@p),N@p float,1 exec sp_executesql NInsert T1 Values (@p),N@p float,1

18 18 / 70 Stored Procedure WITH RECOMPILEWITH RECOMPILE

19 19 / 70 Stored Procedure SqlCommandCommandTypeSqlCommandCommandType –Definizione di tutti i parametri tipizzati utilizzati dalla stored procedure –MAI

20 20 / 70 Classica Stored Procedure CREATE PROC spGetCustomerOrders @CustomerID int @NumOrder int OUTPUT AS -- Validazione di parametri di input... -- Logica applicativa (eventualmente chiama altre SP)... -- Restituzione di uno o più result set... -- Restituisco il valore di ritorno

21 21 / 70 Stored Procedure FOR XML CREATE PROC spGetCustomerOrdersXML @CustomerID int @NumOrder int OUTPUT AS -- Validazione di parametri di input... -- Logica applicativa (eventualmente chiama altre SP)... -- Restituzione di uno o più result set SELECTC.CustomerID,O.OrderID,O.OrderDateFROM Customer C Left Join Orders O ON C.CustomerID=O.CustomerID WHERE C.CustomerID = @CustomerID FOR XML AUTO, ELEMENTS –- o EXPLICIT -- Restituisco il valore di ritorno

22 22 / 70 Posso passare un set di record ad una SP? CREATE PROC spInsertCustomersXML @RecordSetXML varchar(1024) AS -- Carico il doc XML nel DOM sp_xml_preparedocument @h OUTPUT, @ RecordSetXML -- Eseguo un inserimento in una tabella filtrando -- le informazioni che mi servono attraverso XPath OpenXML(@h,'//Customer') WITH (CustomerID varchar(5) '@ID', CompanyName varchar(32),'@name') -- Rimuovo il documento dalla memoria sp_xml_removedocument

23 23 / 70 SQL Server 2000 Best Practices

24 24 / 70 Cursori row-basedrow-based –set

25 25 / 70 SqlConnection IDbConnectionIDbConnection ConnectionStringSqlCommandSqlDataReaderConnectionStringSqlCommandSqlDataReader –Close()Dispose() BeginTransactionBeginTransaction –SqlTransaction

26 26 / 70 SqlConnection AttachDBFilenameSqlClientPermissionAttachDBFilenameSqlClientPermission

27 27 / 70 SqlConnection SqlCommandSqlDataAdapterSqlCommandSqlDataAdapter [Visual Basic] Dim nwindConn As SqlConnection = New SqlConnection("Data _ Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind") nwindConn.Open()[C#] SqlConnection nwindConn = new SqlConnection("Data Source=localhost; Integrated Security=SSPI; Initial Catalog=northwind"); nwindConn.Open();

28 28 / 70 SqlCommand

29 29 / 70 SqlCommand Implementa linterfaccia IDbCommandImplementa linterfaccia IDbCommand –ExecuteReader() Da utilizzare quando è previsto un result set come ritornoDa utilizzare quando è previsto un result set come ritorno –ExecuteScalar() Da utilizzare per aggregazioni o risultati di calcoliDa utilizzare per aggregazioni o risultati di calcoli Ritorna solo la prima colonna della prima riga, gli altri dati vengono persiRitorna solo la prima colonna della prima riga, gli altri dati vengono persi –ExecuteNonQuery() Ottimizzato per query che non ritornano result set ma solo parametri di ritorno o numero di record modificatiOttimizzato per query che non ritornano result set ma solo parametri di ritorno o numero di record modificati –ExecuteXmlReader()

30 30 / 70 SqlCommand e query libere Dim sqlConn As SQLConnection Dim sqlCmd As SQLCommand Dim rowsAffected As Integer Try ' Creo la connessione sqlConn = New SQLConnection(myConnString) ' Creo il comando sqlCmd = New SQLCommand() ' specifico il tipo di comando With sqlCmd.CommandType = CommandType.Text.CommandText = "Insert Customers (Alias, CustomerName) _ Values ('myAlias','myName')".Connection = sqlConn End With ' apro la connessione sqlConn.Open() ' eseguo il comando, vengono ritornate le righe inserite rowsAffected = sqlCmd.ExecuteNonQuery() Catch e As Exception ' gestisco leccezione … Finally ' chiudo la connesione sqlConn.Close() End Try

31 31 / 70 SqlCommand e le Stored Procedure ParametersParameters

32 32 / 70 SqlCommand e le Stored Procedure ExecuteReader()DataReaderExecuteReader()DataReader DBNull.Value per impostare a null un parametro di input di una SPDBNull.Value per impostare a null un parametro di input di una SP CommandBehaviorCommandBehavior

33 33 / 70 SqlCommand e le Stored Procedure sqlConn = New SQLConnection(myConnString) ' Create a new command object sqlCmd = New SQLCommand() ' Specify the stored procedure and connection With sqlCmd.CommandType = CommandType.StoredProcedure.CommandText = "InsertCustomer".Connection = sqlConn End With ' Define and add a parameter to the parameters collection param = sqlCmd.Parameters.Add(New SQLParameter("@p", SQLDBType.NVarChar, 100) With param.Direction = ParameterDirection.Input ' Set the parameter value.Value = xyz" End With ' Add remaining parameters … ' Open the connection sqlConn.Open() ' Execute the command rowsAffected = sqlCmd.ExecuteNonQuery()

34 34 / 70 SqlDataReader SqlCommandSqlCommand Read()IEnumerableRead()IEnumerable

35 35 / 70 SqlDataReader IDataReaderIDataRecordIDataReaderIDataRecord –Per accesso a informazioni in formato rettangolare e non È possibile accedere ai dati nelle singole colonne per indicenome del campo o attraverso metodo accessori dedicati ai tipi di dato contenutiÈ possibile accedere ai dati nelle singole colonne per indicenome del campo o attraverso metodo accessori dedicati ai tipi di dato contenuti –GetDateTime()GetDouble()GetGuid(), GetInt32()

36 36 / 70 SqlDataReader NextResult()NextResult() La struttura del result set è descritta attraverso una schema tableLa struttura del result set è descritta attraverso una schema table –GetSchemaTable()

37 37 / 70 Utilizzo di SqlDataReader [Visual Basic] Dim myReader As SqlDataReader = myCommand.ExecuteReader() Do While myReader.Read() Console.WriteLine(vbTab & "{0}" & vbTab & "{1}", myReader.GetInt32(0), myReader.GetString(1)) Console.WriteLine(vbTab & "{0}" & vbTab & "{1}", myReader.GetInt32(0), myReader.GetString(1))LoopmyReader.Close()[C#] SqlDataReader myReader = myCommand.ExecuteReader(); while (myReader.Read()) Console.WriteLine("\t{0}\t{1}", myReader.GetInt32(0), myReader.GetString(1)); Console.WriteLine("\t{0}\t{1}", myReader.GetInt32(0), myReader.GetString(1));myReader.Close();

38 38 / 70 XmlReader ExecuteXmlReader() FOR XMLExecuteXmlReader() FOR XML [Visual Basic] Dim custCMD As SqlCommand = New SqlCommand("SELECT * FROM Customers FOR XML _ AUTO, ELEMENTS", nwindConn) Dim myXR As System.Xml.XmlReader = custCMD.ExecuteXmlReader() [C#] SqlCommand custCMD = new SqlCommand("SELECT * FROM Customers FOR XML AUTO, ELEMENTS", nwindConn); System.Xml.XmlReader myXR = custCMD.ExecuteXmlReader();

39 39 / 70 Operazioni di Data Definition Language ExecuteNonQuery()ExecuteNonQuery()

40 40 / 70 Transazioni in ADO.NET Transazioni localiTransazioni locali –Allinterno del codice SQL delle Stored Procedure BEGIN/COMMIT TRANBEGIN/COMMIT TRAN –SqlOleDbTransaction

41 41 / 70 Transazioni in ADO.NET [C#] SqlConnection conn = new SqlConnection(); conn.Open("..."); SqlTransaction tx = conn.BeginTransaction(); SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = "..."; cmd.Transaction = tx; cmd.ExecuteNonQuery(); tx.Commit(); [VB.NET] OleDbConnection conn = new OleDbConnection(); conn.Open("..."); OleDbTransaction tx = conn.BeginTransaction(); OleDbCommand cmd = conn.CreateCommand(); cmd.CommandText = "..."; cmd.Transaction = tx; cmd.ExecuteNonQuery(); tx.Commit();

42 42 / 70 Error & Info handling Errori durante lesecuzione di operazioni sulla fonte dati vengono intercettati attraverso le eccezioniErrori durante lesecuzione di operazioni sulla fonte dati vengono intercettati attraverso le eccezioni Ogni Managed providers implementa le proprie eccezioniOgni Managed providers implementa le proprie eccezioni –SqlException SqlErrorSqlError

43 43 / 70 Error & Info handling SqlInfoMessageEventHandlerInfoMessa geSqlInfoMessageEventHandlerInfoMessa ge

44 44 / 70 Error & Info handling public static int Main(string[] args) { try { SqlConnection conn = new SqlConnection(ConnectionString); // Associo un event handler allevento di InfoMessage conn.InfoMessage += new SqlInfoMessageEventHandler(myHandler); conn.Open(); } catch (SqlException e) { for (int i=0; i < e.Errors.Count; i++) { Console.WriteLine("Index #" + i + "\n Error: " + e.Errors[i].ToString() + "\n"); } catch (Exception e) { Console.WriteLine(e.Message); } finally { conn.Close(); } return 0; }

45 45 / 70 Error & Info handling public static void myHandler(object conn, SqlInfoMessageEventArgs e) { Console.WriteLine("caught a SQL warning"); for (int i=0; i < e.Errors.Count; i++) { Console.WriteLine("Index#" + i + "\n" + "Warning:" + e.Errors[i].ToString() + "\n"); }

46 46 / 70 Considerazioni sulle performance Dispose()DataReaderDispose()DataReader

47 47 / 70 Considerazioni sulle performance FOR XMLXmlReaderFOR XMLXmlReader

48 48 / 70 Considerazioni sulle performance Tenere sempre presente il tipo di comando e di valori di ritornoTenere sempre presente il tipo di comando e di valori di ritorno –Singola entità letta per chiave primaria Stored Procedure con parametri di ritornoStored Procedure con parametri di ritorno –Valore scalare ExecuteScalar()ExecuteScalar() –DataReader

49 49 / 70 Codice portabile tra più Data Provider

50 50 / 70 Integrare applicazioni.NET con altri database server

51 51 / 70 OleDb Managed Provider

52 52 / 70 OleDb Managed Provider Common Language Runtime Data Source Relazionale e non OleDbManagedProvider ProviderOLEDB

53 53 / 70 OLEDB Managed Provider Object Model OleDbConnection OleDbCommand OleDbParameterCollectionOleDbDataReader.Connection.OleDbParameter.CreateCommand.Parameters.Item.Add.CreateParameter.ExecuteReader Object.Item

54 54 / 70 OleDbConnection [Visual Basic] Dim myConnection As String = "Provider=SQLOLEDB;Data Source=localhost;Initial _ Catalog=Northwind;Integrated Security=SSPI;" Dim myConn As New OleDbConnection(myConnection) myConn.Open() [C#] String myConnection = "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI;"; OleDbConnection myConn = new OleDbConnection(myConnection); myConn.Open();

55 55 / 70 OleDbCommand public void ReadMyData(string myConnString) { string mySelectQuery = "SELECT OrderID, CustomerID FROM Orders"; string mySelectQuery = "SELECT OrderID, CustomerID FROM Orders"; OleDbConnection myConnection = new OleDbConnection(myConnString); OleDbConnection myConnection = new OleDbConnection(myConnString); OleDbCommand myCommand = new OleDbCommand(mySelectQuery,myConnection); OleDbCommand myCommand = new OleDbCommand(mySelectQuery,myConnection); myConnection.Open(); myConnection.Open(); OleDbDataReader myReader = myCommand.ExecuteReader(); OleDbDataReader myReader = myCommand.ExecuteReader(); try try { while (myReader.Read()) while (myReader.Read()) {Console.WriteLine(myReader.GetInt32(0) + ", " + myReader.GetString(1));} {Console.WriteLine(myReader.GetInt32(0) + ", " + myReader.GetString(1));} } finally finally { // da chiudere sempre dopo aver terminato la lettura // da chiudere sempre dopo aver terminato la lettura myReader.Close(); myReader.Close(); // da chiudere sempre dopo aver terminato la lettura // da chiudere sempre dopo aver terminato la lettura myConnection.Close();} myConnection.Close();}}

56 56 / 70 ODBC Managed Provider

57 57 / 70 ODBC Managed Provider Common Language Runtime Data Source Relazionale OdbcManagedProvider DriverODBC

58 58 / 70 ODBC Managed Provider Object Model OdbcConnection OdbcCommand OdbcParameterCollectionOdbcDataReader.Connection OdbcParameter.CreateCommand.Parameters.Item.Add.CreateParameter.ExecuteReader Object.Item

59 59 / 70 OleDbDataReader ExecuteReader()ExecuteReader()

60 60 / 70 Utilizzo di OleDbDataReader Public Sub ReadMyData(myConnString As String) Dim mySelectQuery As String = "SELECT OrderID, CustomerID FROM Orders" Dim myConnection As New OleDbConnection(myConnString) Dim myCommand As New OleDbCommand(mySelectQuery, myConnection) myConnection.Open() Dim myReader As OleDbDataReader myReader = myCommand.ExecuteReader() ' La chiamata a Read posiziona sul primo record While myReader.Read() Console.WriteLine(myReader.GetInt32(0).ToString() + ", " _ + myReader.GetString(1)) End While ' chiudere il reader myReader.Close() ' chiudere la connessione myConnection.Close() End Sub

61 61 / 70 DB2 e ADO.NET ODBC.Net Data Provider OdbcConnection OdbcCommand OdbcDataAdapter OdbcDataReader OLE DB.Net Data Provider OleDbConnection OleDbCommand OleDbAdapter OleDbDataReader DB2.Net Data Provider DB2Connection DB2Command DB2DataAdapter DB2DataReader IBM DB2 ODBC Driver IBM DB2 OLE DB Provider ApplicationSystem.Data.OleDbApplicationMicrosft.Data.ODBCApplicationIBM.Data.DB2 DB2

62 62 / 70 DB2Connection Object

63 63 / 70 DB2Command Object

64 64 / 70 DB2DataReader Object

65 65 / 70 Oracle e.NET Microsoft.NET Data Provider per Oracle –Prodotto da Microsoft –Usa gli strumenti client di Oracle Oracle Data Provider per.NET (ODP.NET) –Sviluppato da Oracle –Integrazione completa –Espone tutte le caratteristiche di un Oracle DB Oracle Connect per.NET

66 66 / 70.NET Data Providers

67 67 / 70 ODP.NET DataSet Oracle DataAdapter Oracle Transaction Oracle Command Oracle Connection Oracle DataReader OracleCommand Builder

68 68 / 70 ODP.NET

69 69 / 70 In Sintesi

70 70 / 70 Link utili

71 71 / 70 News

72 72 / 70


Scaricare ppt "1 / 70 ADO.NET, i Data Provider e l'architettura connessa Silvano Coriani Developer & Platform Evangelism MCTrainer MCSDeveloper MCADeveloper MCSEInternet."

Presentazioni simili


Annunci Google