Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoAmbrogino Rossi Modificato 11 anni fa
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
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.