La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

SQL CE 2.0 e SQl 2005 Mobile Roberto Brunetti Fabio Santini

Presentazioni simili


Presentazione sul tema: "SQL CE 2.0 e SQl 2005 Mobile Roberto Brunetti Fabio Santini"— Transcript della presentazione:

1

2 SQL CE 2.0 e SQl 2005 Mobile Roberto Brunetti Fabio Santini

3 OLEDB CE CLR /.NET CF QP/Cursor Engine/ES Client Agent: Replication andRDA ADO CE v3.1 OLEDB / Replication API IIS CLIENTSERVER Storage Engine / Repl Tracking SQL CE Edition v2.0 eVB 3.0 eVC 3.0 OLEDB OLEDB Server Agent: Replication and Remote Data Access HTTP b, CDPD, GSM, CDMA, TDMA, etc. SQL Server CE Data Provider Native/Unmanaged Stack Data Provider SQL Server Client Data Provider ADO.NET VS.NET (VB.NET, C#).NET CF / Managed Stack TDS Ethernet Scenario Connesso Scenario Disconnessos

4 SQL Server CE Compatibilità con SQL ServerCompatibilità con SQL Server Stesso ResultsetStesso Resultset Data Type CompatibleData Type Compatible FootprintFootprint ~700kb per CPU X86~700kb per CPU X86 DisponibileDisponibile Windows CE 2.11 e successiveWindows CE 2.11 e successive Usato nativamente o replicando da SQLUsato nativamente o replicando da SQL

5 Cosé? OLEDB ProviderOLEDB Provider Non proprio conforme alle specifiche OLEDBNon proprio conforme alle specifiche OLEDB E un database con un DLL wrapperE un database con un DLL wrapper In CE non esistono i serviziIn CE non esistono i servizi Supporta ADOCESupporta ADOCE Supporta OLEDB CE APISupporta OLEDB CE API Supporta ADO.NET del.NET CFSupporta ADO.NET del.NET CF

6 SQL Server CE v2.0 é supportato Pocket PCPocket PC 2000 – – Windows Mobile 5.0Windows Mobile 5.0 Windows CE 4.2Windows CE 4.2 Non è supportato da SmartPhone 2003Non è supportato da SmartPhone 2003 Sql 2005 Mobile Edition e VM 5.0Sql 2005 Mobile Edition e VM 5.0

7 Database Feature 1.x Multi-column indexesMulti-column indexes Referential integrityReferential integrity Sub-selects (IN)Sub-selects (IN) DefaultDefault Inner/outer joinInner/outer join 32 index per table32 index per table One file databaseOne file database Null supportNull support Unicode supportUnicode support TransactionTransaction Data-typesData-types Real, Numeric, NVarChar, NText, Image, Integer, DateTime, VarBinary, UniqueIdentifier, Money Having/group byHaving/group by Seek on indexSeek on index Set functionsSet functions Identity attributeIdentity attribute TCO supportTCO support Local security - DB encryption (128bit) and database passwordLocal security - DB encryption (128bit) and database password

8 2.0 Features UnionUnion SELECT * FROM A UNION SELECT * FROM BSELECT * FROM A UNION SELECT * FROM B Intrinsic Function Function Query parametricheQuery parametriche INSERT INTO mytable (col1, col2) VALUES (?, ?);INSERT INTO mytable (col1, col2) VALUES (?, ?); Index PullIndex Pull Recupero indici durante scaricamento con RDARecupero indici durante scaricamento con RDA Connectivity Setup WizardsConnectivity Setup Wizards Setup più sempliceSetup più semplice Optional Error StringsOptional Error Strings DLL per messaggi erroreDLL per messaggi errore ISQLW CE piú visualeISQLW CE piú visuale

9 Amministrazione NativoNativo ISQLWISQLW CommoventeCommovente Remote SQL CE da DesktopRemote SQL CE da Desktop innovations.com/html/remotesqlce.htmlhttp://www.gui- innovations.com/html/remotesqlce.htmlhttp://www.gui- innovations.com/html/remotesqlce.htmlhttp://www.gui- innovations.com/html/remotesqlce.html 30-day trial30-day trial 29,99 $ con licenza e supporto29,99 $ con licenza e supporto

10 Remote SQL CE Generazione di SDF da DB DesktopGenerazione di SDF da DB Desktop

11 Integrazione con.NET CF System.Data.SqlServerCESystem.Data.SqlServerCE Espone tutte le funzionalitá SQL CEEspone tutte le funzionalitá SQL CE SqlCEDataReaderSqlCEDataReader SqlCEDataAdapterSqlCEDataAdapter SqlCECommandSqlCECommand SqlCEParameterSqlCEParameter Utilizzo di Try/CatchUtilizzo di Try/Catch System.Data.SqlServerCe.SqlCeExceptionSystem.Data.SqlServerCe.SqlCeException Utilizzabile stand-aloneUtilizzabile stand-alone DemoDemo Cerca in localeCerca in locale Aggiorna localeAggiorna locale

12 SqlCeConnection Provider=Microsoft.SQLServer.OLEDB.CE.1.0;Da taSource=\directory\file.sdfProvider=Microsoft.SQLServer.OLEDB.CE.1.0;Da taSource=\directory\file.sdf.Open.Open.Close.Close SQL CE 2.0 non supporta connessioni contemporanee !!!SQL CE 2.0 non supporta connessioni contemporanee !!!

13 Creazione di.sdf da codice try{ SqlCeEngine sqlEngine = new SqlCeEngine("Data Source=\Pippo.sdf); sqlEngine.CreateDatabase();} catch (SqlCeException ex) { ShowErrors(ex, "Impossibile creare il db locale"); }

14 Tabelle di sistema INFORMATION_SCHEMA.TABLESINFORMATION_SCHEMA.TABLES SELECT COUNT(*)SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLESFROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='Clienti'WHERE TABLE_NAME='Clienti'

15 Sincronizzazione Due metodologieDue metodologie RDA – Remote Data AccessRDA – Remote Data Access SQL Server 6.5 Service Pack 5 +SQL Server 6.5 Service Pack 5 + Merge Replication con SQL 2000Merge Replication con SQL 2000 SQL Server puo fare da ponte verso altri databaseSQL Server puo fare da ponte verso altri database Utilizzando i Linked ServerUtilizzando i Linked Server Lutilizzo di tabelle locali ha comunque senso per ridurre la bandaLutilizzo di tabelle locali ha comunque senso per ridurre la banda

16 Connectività verso LAN Come sempre: WebCome sempre: Web HTTPHTTP Internet e IntranetInternet e Intranet Sicurezza gestita da IISSicurezza gestita da IIS Authentication (anonymous, basic, NTLM)Authentication (anonymous, basic, NTLM) AuthorizationAuthorization Encryption (SSL)Encryption (SSL) Accesso consentito tramite firewallAccesso consentito tramite firewall MaMa Compressione per banda ridottaCompressione per banda ridotta Message-based per meno roundtripMessage-based per meno roundtrip

17 Configurazione IIS SSCESA20.DLL e lapplicazione (estensione) ISAPI da utilizzareSSCESA20.DLL e lapplicazione (estensione) ISAPI da utilizzare Serve Virtual Directory con permesse ExecuteServe Virtual Directory con permesse Execute SQL Server CE Connectivity ManagementSQL Server CE Connectivity Management Configura Virtual DirectoryConfigura Virtual Directory Sicurezza IISSicurezza IIS Sicurezza ACL sulla cartellaSicurezza ACL sulla cartella

18 Remote Data Access Se il device è connesso spessoSe il device è connesso spesso Dove la Merge Replication non è necessariaDove la Merge Replication non è necessaria Dove la Merge Replication è troppo pesanteDove la Merge Replication è troppo pesante Per avere più controllo da codicePer avere più controllo da codice Elimina la necessità di un DesktopElimina la necessità di un Desktop Accesso a SQL Server 7.0 e 2000Accesso a SQL Server 7.0 e 2000 Download to device e disconnessioneDownload to device e disconnessione Tracking anche disconnessoTracking anche disconnesso

19 Remote Data Access Download dati clienti e piazzoleDownload dati clienti e piazzole DisconnessioneDisconnessione Giro delle piazzole per controlloGiro delle piazzole per controllo Per irregolarità o modifichePer irregolarità o modifiche Tabella PiazzoleTabella Piazzole Tabella SegnalazioniTabella Segnalazioni ConnessioneConnessione Sincronizzazione dei DatiSincronizzazione dei Dati

20 RDA: Metodi PullPull Porta i dati sul devicePorta i dati sul device Selezione via statement SQLSelezione via statement SQL Viste / Stored Procedure / Query SQLViste / Stored Procedure / Query SQL Creazione tabelle localiCreazione tabelle locali PushPush Invia le modifiche al serverInvia le modifiche al server Submit SQLSubmit SQL Invio diretto di SQL DMLInvio diretto di SQL DML

21 Inizializzazione Dim x = New SqlCeRemoteDataAccessDim x = New SqlCeRemoteDataAccess x.InternetLogin =x.InternetLogin = x.InternetPassword =x.InternetPassword = x.InternetUrl = x.com/sqlce/sscesa20.dllx.InternetUrl = x.com/sqlce/sscesa20.dll x.LocalConnectionStringx.LocalConnectionString x.InternetProxyServerx.InternetProxyServer

22 Pull Object.Pull( tabella locale, statement sql, oledb connection usata lato server, [RdaTrackOption], [tabella segnalazione errori] ) Demo Campeggi

23 OLEDB Connection String E la stringa usata da sscesa20.dll per accedere al databaseE la stringa usata da sscesa20.dll per accedere al database Specificare il tipo di autenticazione verso SQLSpecificare il tipo di autenticazione verso SQL StandardStandard Specificare Username e PasswordSpecificare Username e Password IntegrataIntegrata Viene usato laccount utilizzato da IIS per far girare sscesa20.dllViene usato laccount utilizzato da IIS per far girare sscesa20.dll Se accesso anonimo consentito IUSR_nomemacchinaSe accesso anonimo consentito IUSR_nomemacchina Altrimenti User e Password specificati sulloggetto SqlCeRemoteDataAccessAltrimenti User e Password specificati sulloggetto SqlCeRemoteDataAccess

24 Tabelle Create Le tabelle vengono create in localeLe tabelle vengono create in locale DemoDemo Vediamo la struttureVediamo la strutture s_operations_operation Tiene loperazione effettuataTiene loperazione effettuata Indice per successivo sort durante il PushIndice per successivo sort durante il Push s_BinaryKeys_BinaryKey Chiave primariaChiave primaria Scaricata tramite sp_primary_keys_rowsetScaricata tramite sp_primary_keys_rowset NON devono esistereNON devono esistere Gestione incrementale manualeGestione incrementale manuale

25 Push Object.Push( tabella locale, oledb connection usata lato server, [RdaBatchOption]) Demo Campeggi

26 BatchingOn SET IMPLICIT_TRANSACTIONS ON int exec output, varchar(50)', N'INSERT INTO "SEGNALAZIONI"("IdNota", "IdPiazzola", "TipoNota", @P4)', 1, 1, 0, NULL // Lancia tutti i comandi effettuati sulla tabella exec sp_execute 1, 3, 2, 0, 'tutto ok' // Unprepare dei comandi exec sp_unprepare 1 IF > 0 COMMIT TRAN

27 BatchingOff // Dichiarazione dei comandi di INSERT/UPDATE/DELETE int exec output, int', N'UPDATE "PIAZZOLE" SET "IdPiazzola" "IdCliente" "DataArrivo" "DataPartenza" "Persone" "Tende" WHERE "IdPiazzola" 1, 1, 'Jun :00:00:000AM', 'Jan :00:00:000AM', 4, 2, 1 Lancia tutti i comandi effettuati sulla tabella exec sp_execute 1, 2, 2, 'May :00:00:000AM', 'Jan :00:00:000AM', 1, 1, 2 // Unprepare dei comandi exec sp_unprepare 1

28 SubmitSql Object.SubmitSQL( statement sql, oledb connection usata lato server ) Demo Campeggi N.B. Non si usa se connessione diretta Utilissimo se connessione Http

29 Gestione Eccezioni SQLCE Classe SqlCeExceptionClasse SqlCeException Espone collezione ErrorsEspone collezione Errors For Each err in SqlCeException.ErrorsFor Each err in SqlCeException.Errors err.HResult.ToString(X)err.HResult.ToString(X) err.Messageerr.Message err.NativeErrorerr.NativeError err.Sourceerr.Source err espone anche NumericErrorParameterserr espone anche NumericErrorParameters Collezione di stringCollezione di string

30 Eccezioni in Push Per ogni conflitto o problemaPer ogni conflitto o problema Viene utilizzata (se specificata) la tabella locale indicata come tabella di erroreViene utilizzata (se specificata) la tabella locale indicata come tabella di errore A fronte di una eccezione si possono analizzare i recordA fronte di una eccezione si possono analizzare i record Utilizzando ADO.NET direttamente sulla tabellaUtilizzando ADO.NET direttamente sulla tabella

31 Limiti di RDA Pull crea le tabellePull crea le tabelle Non è incrementaleNon è incrementale Campi IdentityCampi Identity Master DetailMaster Detail Logica Business su diversi recordLogica Business su diversi record Facciamo due chiacchereFacciamo due chiacchere

32 Performance La RAM scarseggia….e lapplicazione non galleggia

33 Native VS Managed In assoluto il codice via OLEDBCE è più veloceIn assoluto il codice via OLEDBCE è più veloce Più codice da scriverePiù codice da scrivere Più difficile da manutenerePiù difficile da manutenere SQLCE SQLMobile

34 In un Post SELECT IMEI, ProductCode, Quantity FROM (SELECT NULL AS IMEI, product AS ProductCode, (physicalqty - allocatedqty) AS Quantity FROM importstock WHERE (NOT mpstype IN(N'U', N'C', N'M', N'X', N'Y', N'P')) AND product IN (SELECT ProductCode FROM (SELECT importstock.product AS ProductCode FROM StockCountSchedule INNER JOIN StockCountProductCategories ON (StockCountSchedule.ID = StockCountProductCategories.ID) INNER JOIN importstock ON (StockCountProductCategories.Product_Type = importstock.product_type) WHERE (StockCountSchedule.IsRecount = 0) AND (StockCountSchedule.ID = ) UNION SELECT ProductCode FROM StockCountSchedule INNER JOIN CrossDevice_ProductsToRecount ON (StockCountSchedule.ID = CrossDevice_ProductsToRecount.StockCountID) WHERE (StockCountSchedule.IsRecount = 1) AND (StockCountSchedule.ID = )) AS StockCountProducts) UNION SELECT IMEI.imei AS IMEI, NULL AS ProductCode, NULL AS Quantity FROM importstock INNER JOIN IMEI ON importstock.product = IMEI.product WHERE (mpstype IN(N'U', N'C', N'M', N'X', N'Y', N'P')) AND importstock.product IN (SELECT ProductCode FROM (SELECT StockCountSchedule.ID AS StockCountID, importstock. product AS ProductCode FROM StockCountSchedule INNER JOIN StockCountProductCategories ON (StockCountSchedule.ID = StockCountProductCategories.ID) INNER JOIN importstock ON (StockCountProductCategories.Product_Type = importstock.product_type) WHERE (StockCountSchedule.IsRecount = 0) UNION SELECT StockCountSchedule.ID AS StockCountID, ProductCode FROM StockCountSchedule INNER JOIN CrossDevice_ProductsToRecount ON (StockCountSchedule.ID = CrossDevice_ProductsToRecount.StockCountID) WHERE (StockCountSchedule.IsRecount = 1)) AS StockCountProducts)) AS StockCountItemsSELECT IMEI, ProductCode, Quantity FROM (SELECT NULL AS IMEI, product AS ProductCode, (physicalqty - allocatedqty) AS Quantity FROM importstock WHERE (NOT mpstype IN(N'U', N'C', N'M', N'X', N'Y', N'P')) AND product IN (SELECT ProductCode FROM (SELECT importstock.product AS ProductCode FROM StockCountSchedule INNER JOIN StockCountProductCategories ON (StockCountSchedule.ID = StockCountProductCategories.ID) INNER JOIN importstock ON (StockCountProductCategories.Product_Type = importstock.product_type) WHERE (StockCountSchedule.IsRecount = 0) AND (StockCountSchedule.ID = ) UNION SELECT ProductCode FROM StockCountSchedule INNER JOIN CrossDevice_ProductsToRecount ON (StockCountSchedule.ID = CrossDevice_ProductsToRecount.StockCountID) WHERE (StockCountSchedule.IsRecount = 1) AND (StockCountSchedule.ID = )) AS StockCountProducts) UNION SELECT IMEI.imei AS IMEI, NULL AS ProductCode, NULL AS Quantity FROM importstock INNER JOIN IMEI ON importstock.product = IMEI.product WHERE (mpstype IN(N'U', N'C', N'M', N'X', N'Y', N'P')) AND importstock.product IN (SELECT ProductCode FROM (SELECT StockCountSchedule.ID AS StockCountID, importstock. product AS ProductCode FROM StockCountSchedule INNER JOIN StockCountProductCategories ON (StockCountSchedule.ID = StockCountProductCategories.ID) INNER JOIN importstock ON (StockCountProductCategories.Product_Type = importstock.product_type) WHERE (StockCountSchedule.IsRecount = 0) UNION SELECT StockCountSchedule.ID AS StockCountID, ProductCode FROM StockCountSchedule INNER JOIN CrossDevice_ProductsToRecount ON (StockCountSchedule.ID = CrossDevice_ProductsToRecount.StockCountID) WHERE (StockCountSchedule.IsRecount = 1)) AS StockCountProducts)) AS StockCountItems Gira bene in SQL Server 2000, ma non sotto SQL CE…Gira bene in SQL Server 2000, ma non sotto SQL CE…

35 General Performance Tips Limitare record e colonne nelle SELECTLimitare record e colonne nelle SELECT Fare poche Open/CloseFare poche Open/Close Meglio lasciare aperta una connessioneMeglio lasciare aperta una connessione Occhio al numero di oggetti in menoriaOcchio al numero di oggetti in menoria SqlCeDataReader.Close/DisposeSqlCeDataReader.Close/Dispose Classi riusabili di accesso ai datiClassi riusabili di accesso ai dati ScriverseleScriversele Data Access Application BlockData Access Application Block OpenNETCF 1.3OpenNETCF 1.3 Meglio Comprende anche Cache dei parametriComprende anche Cache dei parametri SQLCE SQLMobile

36 DAAB Architecture Versione ridotta dellanalogo per DesktopVersione ridotta dellanalogo per Desktop

37 Non usare SqlCeCommandBuilder SqlCeConnection connection = GetConnection(); DataSet ds = new DataSet(); string sql = …"; SqlCeHelper.FillDataset(connection, sql, ds, new string[] { Prodotti" } ); DataTable table = ds.Tables["Products"]; DataRow addedRow = table.Rows.Add(new object[] { DBNull.Value, Nuovo", DBNull.Value, 10 } ); table.Rows[0]["ProductName"] = Prod Modificato"; SqlCeCommand insertCmd = SqlCeHelper.CreateCommand(connection, "INSERT INTO Products (ProductName, UnitPrice) VALUES(?, ?)", "ProductName:String", "UnitPrice:Currency"); SqlCeCommand updateCmd = SqlCeHelper.CreateCommand(connection, "UPDATE Products SET ProductName = ? WHERE ProductID = ?", "ProductName:String", "ProductID:Int32" ); SqlCeCommand deleteCmd = SqlCeHelper.CreateCommand(connection, "DELETE Products WHERE ProductID = ?", "ProductID:Int32" ); SqlCeHelper.UpdateDataset(insertCmd, deleteCmd, updateCmd, ds, Prodotti");

38 Performance Big-hitters Base Table CursorsBase Table Cursors Parameterized QueriesParameterized Queries DataReader versus DataSetDataReader versus DataSet SqlCeResultSet versus DataSetSqlCeResultSet versus DataSet IndiciIndici

39 Base Table Cursor Bypassano il Query ProcessorBypassano il Query Processor Tutte le colonne per ogni riga recuperataTutte le colonne per ogni riga recuperata Massimo delle performance per leggere tutte le colonneMassimo delle performance per leggere tutte le colonne SqlCeCommand cmd = new SqlCeCommand(); cmd.CommandText = "Orders"; cmd.CommandType = CommandType.TableDirect; SQLCE SQLMobile

40 Seek/SetRange – Basic Utilizzabile per aprire lindiceUtilizzabile per aprire lindice Massimo delle performance per RangeMassimo delle performance per Range Massimo delle performance per singolo recordMassimo delle performance per singolo record cmd.CommandType = CommandType.TableDirect; cmd.CommandText = "Orders"; //Assunzione: Lindice contiene una sola colonna [datetime] cmd.IndexName = "SomeIndex";// Lettura tradizionale

41 Use Queries? SELECT "Customer ID" FROM Orders WHERE "Order ID" = VS Base Table

42 Parameterized Queries Compilate once e eseguite molte volteCompilate once e eseguite molte volte Usare lo stesso object SqlCeCommand che cacha i compiled planUsare lo stesso object SqlCeCommand che cacha i compiled plan Sql 2005 Mobile anche Named ParameterSql 2005 Mobile anche Named Parameter cmd.CommandText = UPDATE myTable set col1=? where col2=?"; // Evitare SqlCeParameter(string, object) constructor cmd.Parameters.Add("p1", SqlDbType.Decimal); cmd.Parameters.Add("p2", SqlDbType.SmallInt); cmd.Prepare(); // Eseguire più volte … SQLCE SQLMobile

43 Parameterized Queries

44 Data Reader VS Data Set Dove possibile usare il DataReaderDove possibile usare il DataReader Più veloce del DataSet, soprattutto con result sets grandi (5x in alcuni casi)Più veloce del DataSet, soprattutto con result sets grandi (5x in alcuni casi) Accesso diretto a SQL Server CEAccesso diretto a SQL Server CE Nessun doppio bufferingNessun doppio buffering ControContro Non bindable ai controlliNon bindable ai controlli No scrollin, no updateNo scrollin, no update DataReader non usabile per remotizzareDataReader non usabile per remotizzare Web Service / MSMQ …etcWeb Service / MSMQ …etc SQLCE SQLMobile

45 Performance: Simple Usare Typed AccessUsare Typed Access GetString / GetInt…GetString / GetInt… Usare campi posizionali !!!Usare campi posizionali !!! X = dr.GetOrdinal(nome)X = dr.GetOrdinal(nome) Y = dr.GetOrdinal(cognome)Y = dr.GetOrdinal(cognome) CicloCiclo dr.GetString(x)dr.GetString(x) dr.GetString(y)dr.GetString(y) Fine CicloFine Ciclo

46 Data Reader – Optimal Usage Usare accesso Strongly-typedUsare accesso Strongly-typed Usare parametri posizionaliUsare parametri posizionali Usare CLR Type al posto di SqlTypeUsare CLR Type al posto di SqlType Per leggere unintera riga usare GetValues() al posto di GetXXX molte voltePer leggere unintera riga usare GetValues() al posto di GetXXX molte volte object[] row = new object[rdr.FieldCount]; while (rdr.Read()) { // Meno function call // Meno function call // processare larray

47 Encryption…paura ? 160K rows160K rows UPDATE Table Set NonIndexCol = RobertoUPDATE Table Set NonIndexCol = Roberto SELECT DateDataType FROM TableSELECT DateDataType FROM Table Qtek 2020 XScale PXA250 (400mhz)Qtek 2020 XScale PXA250 (400mhz) Time in Seconds SELECTUPDATE Encryption vs No Encryption Encyrpted No Encryption

48 Performance Storage Media? Chi lo sa ?!?!Chi lo sa ?!?! RAM, SD, CF, IPSM (NOR), Toshiba NANDRAM, SD, CF, IPSM (NOR), Toshiba NAND SD più veloci di MMCSD più veloci di MMC Time In Seconds SELECTUPDATE Various storage medias RAM SD IPSM

49 Altre cosette SET RUN_MUCH_FASTER = trueSET RUN_MUCH_FASTER = true Database CompactDatabase Compact Corregge eventuali corruzioniCorregge eventuali corruzioni Tabelle contigueTabelle contigue Se indice PK/Unique ordinate per indiceSe indice PK/Unique ordinate per indice Update delle statisticheUpdate delle statistiche QP StatisticQP Statistic Servono per la valutazione dei costiServono per la valutazione dei costi Modificare la location del tempdb per transazioni grandiModificare la location del tempdb per transazioni grandi Il QP di SQL CE QP non fa distinzioni fra RAM e FlashIl QP di SQL CE QP non fa distinzioni fra RAM e Flash SQLCE

50 Sql 2005 Mobile

51 System.Data.SqlClient (160KB) System.Data.SqlServerCe (140KB) System.Data.Common (124KB) eDB – sqlcese30.dll (300KB) sqlceca30.dll (360KB) sqlcesa30.dll (150KB) sqlcerp30.dll (100KB) sqlceqp30.dll (800KB) Storage Engine sqlceoledb30.dll (200KB) Internal SE API eDB API QP Internal QP API SQL 2005 Mobile ReplicationandRDA OLEDB / Replication CLIENTSERVER IIS Server Agent: Replication and Remote Data Access HTTP XML/BizTalk/CS 2002/DTS TDS OLE DB Managed SQL CE + eDB Apps VS.NET (VB.NET, C#)

52 SQL Mobile Platforms PocketPC 2003, Phone EditionPocketPC 2003, Phone Edition Smart Phone 5.0Smart Phone 5.0 Windows CE.NET 5.0Windows CE.NET 5.0 TabletPCTabletPC Visual Studio 2005 (Development)Visual Studio 2005 (Development)

53 SQL Server CE NecessitàNecessità Integrazione con SQL Server 2005Integrazione con SQL Server 2005 AmministrazioneAmministrazione DTSDTS Integrazione con Visual Studio 2005 e.NET CF v2.0Integrazione con Visual Studio 2005 e.NET CF v2.0 Desktop Development e DeploymentDesktop Development e Deployment Nuove funzionalitàNuove funzionalità Performance (anche se già buone)Performance (anche se già buone) Più connessioni contemporaneePiù connessioni contemporanee SmartPhone e TabletPCSmartPhone e TabletPC Upgrade Tool per SDF 2.0Upgrade Tool per SDF 2.0

54 Storage Engine Riscritto totalmenteRiscritto totalmente Multi-User supportMulti-User support Row level locking dataRow level locking data Page level locking indexPage level locking index Lock EscalationLock Escalation StabilitàStabilità ACID TransactionACID Transaction Auto re-use di pagine vuoteAuto re-use di pagine vuote Non necessario CompactNon necessario Compact

55 Query Processor Cost-Based OptimizationCost-Based Optimization QP usa piani Cost-basedQP usa piani Cost-based QP usa le statistiche dello storage engineQP usa le statistiche dello storage engine Execution Plan e Query HintsExecution Plan e Query Hints Come in SQL 2000: Analisi e correzione queryCome in SQL 2000: Analisi e correzione query SqlCeResultSetSqlCeResultSet Accesso via ScrollingAccesso via Scrolling Accesso RandomAccesso Random UpdateUpdate Parametri NamedParametri Named

56 SQL Server 2005 Management Studio Connessione a SQL Server o SQL MobileConnessione a SQL Server o SQL Mobile Funzionalità identicheFunzionalità identiche Object ExplorerObject Explorer Query EditorQuery Editor Management DialogManagement Dialog Connessione a DBConnessione a DB Sul desktop o direttamente sul DeviceSul desktop o direttamente sul Device Query Plan e HintQuery Plan e Hint Subscription WizardSubscription Wizard Supporto SSIS (ex DTS)Supporto SSIS (ex DTS) Creare SQL Mobile DBCreare SQL Mobile DB

57 Demo SQL 2005 Registered Server di tipo Sql MobileRegistered Server di tipo Sql Mobile Su DeskTop (SqlMobile\TestDB\Test.sdf)Su DeskTop (SqlMobile\TestDB\Test.sdf) Su Device (Browse...)Su Device (Browse...) Connect -> Object BrowserConnect -> Object Browser New Table / Column / IndexNew Table / Column / Index Views – Programmability (Type)Views – Programmability (Type) Replication Subscription per Merge ReplReplication Subscription per Merge Repl Connect -> New QueryConnect -> New Query SqlMobile\TestDB\QueryPlan.sqlceSqlMobile\TestDB\QueryPlan.sqlce

58 VS 2005 Create SDF

59 VS 2005 Create Table

60 Connessione a SDF su Device

61 Demo VS 2005 Server ExplorerServer Explorer Connect to DatabaseConnect to Database Connessione a SDF su Device/Emulatore/DesktopConnessione a SDF su Device/Emulatore/Desktop Gestione Schema (Create Table/Modify)Gestione Schema (Create Table/Modify) Visualizzazione (New Query) / Edit dei datiVisualizzazione (New Query) / Edit dei dati SDF nel progetto (anche Add New Item)SDF nel progetto (anche Add New Item) Tipologia ContentTipologia Content Creazione Typed DS automatico (Vedere)Creazione Typed DS automatico (Vedere) Diventa un Project Data SourceDiventa un Project Data Source Drag and DropDrag and Drop Controllo Binding SourceControllo Binding Source Drag Tabelle o Colonne sul form per creare controlli BoundDrag Tabelle o Colonne sul form per creare controlli Bound SmartTasks per Master / DetailsSmartTasks per Master / Details Typed ResultSet class baked into generated codeTyped ResultSet class baked into generated code DataSource Window per legare un SDF al progettoDataSource Window per legare un SDF al progetto

62 SqlMobile Database Typed DataSet BindingSource SummaryViewListViewEditView Web Service Remoto

63 Binding The Data To The UI

64 Occhio !!!! Con Drag & Drop direttoCon Drag & Drop diretto Creiamo un DataSetCreiamo un DataSet Che fa double bufferingChe fa double buffering Montiamo linsfrattura di bindingMontiamo linsfrattura di binding BindingContext[source].Position ++BindingContext[source].Position ++ Non possiamo fare operazioni in BackgroundNon possiamo fare operazioni in Background Sono 5 righe di codice per fare molto molto meglio a manoSono 5 righe di codice per fare molto molto meglio a mano Se siamo programmatori SCRIVIAMOLESe siamo programmatori SCRIVIAMOLE

65 SqlCeResultSet Connessione diretta ai datiConnessione diretta ai dati ScrollingScrolling UpdateUpdate DataBindingDataBinding Simile al DataSet come funzionalitàSimile al DataSet come funzionalità Veloce quasi come il DataReaderVeloce quasi come il DataReader Accesso direttoAccesso diretto Nessun double-bufferNessun double-buffer

66 SqlCeResultSet Deriva daSqlCeDataReaderDeriva daSqlCeDataReader Strongly TypedStrongly Typed GetInt32(), GetString()GetInt32(), GetString() SetInt32(), SetString()SetInt32(), SetString() Espone Read per forwardEspone Read per forward Codice identico al ReaderCodice identico al Reader Creabile da cmd.ExecuteResultSet()Creabile da cmd.ExecuteResultSet()

67 SqlCeResultSet private SqlCeResultSet resultSet = null; private ResultSetView view1 = null; /// private void _bindData() { command.CommandText = SELECT * FROM Orders; command.CommandText = SELECT * FROM Orders; ResultSetOptions options = ResultSetOptions.Scrollable | ResultSetOptions options = ResultSetOptions.Scrollable |ResultSetOptions.Updatable; this.resultSet = command.ExecuteResultSet(options); this.resultSet = command.ExecuteResultSet(options); this.view1 = this.resultSet.ResultSetView; this.view1 = this.resultSet.ResultSetView; int[] ordinals = new int[] { 1,3,5,8 }; int[] ordinals = new int[] { 1,3,5,8 }; this.view1.Ordinals = ordinals; this.view1.Ordinals = ordinals; this.dataGrid.DataSource = view1; this.dataGrid.DataSource = view1;

68 ResultSetOptions Combinabili con |Combinabili con | NoneNone ScrollableScrollable UpdatableUpdatable InsensitiveInsensitive Non intercetta le modifiche al DataSourceNon intercetta le modifiche al DataSource SensitiveSensitive Intercetta le modifiche al DataSourceIntercetta le modifiche al DataSource Usare sempre il più leggero possibileUsare sempre il più leggero possibile

69 SqlCeResultSet.Update() SqlCeResultSet rs = commmand.ExecuteResultSet(ResultSetOptions.Updatable); commmand.ExecuteResultSet(ResultSetOptions.Updatable); int idxProductId = rs.GetOrdinal("ProductId"); int idxDesc = rs.GetOrdinal("Desc"); int idxUnitPrice = rs.GetOrdinal("UnitPrice"); while (rs.Read()) { // Retrieve current values // Retrieve current values string productId = rs.GetString(idxProductId); string productId = rs.GetString(idxProductId); string desc = rs.GetString(idxDesc); string desc = rs.GetString(idxDesc); double unitPrice = rs.GetDouble(idxUnitPrice); double unitPrice = rs.GetDouble(idxUnitPrice); // Prepend Product ID to the description // Prepend Product ID to the description rs.SetString(idxDesc, productId + " - " + desc); rs.SetString(idxDesc, productId + " - " + desc); // Increase the price by 10% // Increase the price by 10% rs.SetDouble(idxUnitPrice, unitPrice * 1.1); rs.SetDouble(idxUnitPrice, unitPrice * 1.1); // Apply record changes to db // Apply record changes to db rs.Update(); rs.Update();}

70 SqlCeResultSet ResultSetOptions.ScrollableResultSetOptions.Scrollable ReadFirst, ReadLastReadFirst, ReadLast Read, ReadPreviousRead, ReadPrevious ReadAbsoluteReadAbsolute ReadRelativeReadRelative

71 SqlCeResultSet SqlCeResultSet rs = commmand.ExecuteResultSet(ResultSetOptions.Scrollable | commmand.ExecuteResultSet(ResultSetOptions.Scrollable | ResultSetOptions.Updatable ); ResultSetOptions.Updatable ); // Read entire result backwards rs.ReadLast();while(rs.ReadPrevious();{ //... //...} // Absolute positioning rs.ReadAbsolute(10); // Read 10 records from beginning rs.ReadAbsolute(-10); // Read 10 records from end // Relative positioning rs.ReadRelative(5); // Read forward 5 records rs.ReadRelative(-5); // Read backward 5 records

72 SqlCeResultSet Binding Qualunque ResultSetOptionsQualunque ResultSetOptions Ma includere ResultSetOptions.ScrollableMa includere ResultSetOptions.Scrollable Bind verso ResultSetViewBind verso ResultSetView Esposta come proprietàEsposta come proprietà Stesse interfacce del DataViewStesse interfacce del DataView ITypedList, IBindingList, IList, ICollection, IEnumerable, IDisposableITypedList, IBindingList, IList, ICollection, IEnumerable, IDisposable Utilizzabile con qualunque controllo bindableUtilizzabile con qualunque controllo bindable listBox1.DataSource = rs.ResultSetView; listBox1.DisplayMember = "Desc"; listBox1.ValueMember = "ProductId"; textBox1.DataBindings.Add("Text", rs, "UnitPrice");

73 SQL 2005 Replica Molto automatizzatoMolto automatizzato DemoDemo

74 © 2004 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. MICROSOFT MAKES NO WARRANTIES, EXPRESS OR IMPLIED, IN THIS SUMMARY. Content created by 3 Leaf Solutions


Scaricare ppt "SQL CE 2.0 e SQl 2005 Mobile Roberto Brunetti Fabio Santini"

Presentazioni simili


Annunci Google