2012-01-19 10 views
12

Vorrei persuadere un amico a me che l'utilizzo di Componenti database (DB Aware Controls) in Delphi è di gran lunga l'opzione migliore quando si sviluppano applicazioni di database.Quali sono i vantaggi dell'utilizzo di DB Aware Controls anziché di DB Aware Control in Delphi

Questo dibattito è iniziato con lui molti anni fa: ancora oggi è convinto che l'utilizzo di semplici controlli come TEdit, TStringGrid ecc., Con una serie di metodi getter e setter per popolarli, sia la soluzione migliore sia in termini di flessibilità e manutenibilità dell'intero progetto.

Per me questo suono contro-intuitivo almeno.

Penso che usare DB Aware Controls, come TDBEdit, TDBGrid ecc. Sia la cosa giusta da fare quando si sviluppano applicazioni di database.

Quindi: per favore aiutami a convincerlo con buoni consigli sull'utilizzo di DB Aware Controls!

Grazie in anticipo a tutti coloro che pubblicheranno almeno il proprio consiglio, qualunque cosa sarà a favore dell'una o dell'altra soluzione.

- Fabio Vitale

+7

+1 perché mi piace la domanda, ma sono nel campo di controllo mai usato in Db-aware, quindi non ho intenzione di rispondere. –

+1

Dipende da quale controllo, dbedit etc va bene, ma a volte cose come dbgrid lasciano molto a desiderare – Simon

+4

+1 Per un'applicazione DB piccola (che mi serve soluzione veloce) vorrei andare con DB Aware Controls, specialmente se il DB è locale (Come MS-Access). Per le applicazioni DB su larga scala e completate, preferisco utilizzare i miei controlli non a conoscenza. per esempio per DBGrid utilizzo Albero virtuale in cui il DataSet non è associato. È molto più lavoro, ma almeno non sono limitato. – kobik

risposta

11

DB-Aware vs non DB-Aware è una specie di discussione obsoleta. I controlli DB-Aware hanno un collegamento automatico dei dati, il che significa che si auto-compilano automaticamente con i dati, cambiano il rilevamento e scrivono ai membri del datasource delimitati; nei controlli non-dbaware, sta a te fare quelle attività. Ciò può portare anche a un codice disordinato o a quadri troppo ingegnerizzati solo per fare il databinding. Entrambi gli scenari sono cattivi.

Il tipo di origine dati e la qualità del controllo individuale determinano le prestazioni. Ho visto molto codice per databind TStringGrid semplicemente per evitare TDBGrid a causa del purismo (quando TDbGrid andava bene) - solo uno eccessivamente assurdo perdita di tempo.

È diventato una discussione obsoleta quando TClientDataset è diventato il set di dati de-facto per le applicazioni disconnesse: è possibile estrarre dati, disconnettersi, lavorare sui dati, connettersi nuovamente e applicare le modifiche. Poiché i controlli CDS + DbAware eseguiranno il 99% dell'interfaccia, i controlli non sensibili ai dati verranno utilizzati per l'1% successivo (per alcune interfacce complesse).

Non ho ancora XE2 per vedere se LiveBindings esegue correttamente il databinding OO - in caso affermativo, ora tutti i controlli possono db-aware se necessario.

EDIT: nella risposta di da-soft, lui (lei?) Sostiene che DbAware controlla implementa pattern MVC e LachlanG non è d'accordo sul fatto che, anche se lo fa, il codice stesso non è MVC. Darò i miei $ 0,02 centesimi qui ;-)

Penso che l'uso di una relazione 1: 1 in DataModule ed Entità (come in ERD) - o DataModule e un Form - è possibile ottenere un'applicazione dove le responsabilità sono separati:

  • forma DFM -> layout e in fase di progettazione l'associazione dati (hanno solo Datasources)
  • forma *.pas -> controlla interfaccia e chiede modulo dati per i dati (agisce come un controllore)
  • dati del modulo -> metodi per rispondere forme richieste di reperimento dei dati e dati aggiornamenti

ho normalmente un modulo dati divisi per connessione al database che è passata attraverso le proprietà di moduli/entità.

+2

+1 per menzionare LiveBindings in XE2. –

+2

+1 per aver menzionato TClientDataset – LightBulb

10

DB-aware controlli pro:

  1. Il lavoro per caricare i dati a un controllo e salvare i dati in un set di dati viene eseguita da VCL. Hai meno codice - davvero RAD.
  2. I controlli DB-aware + TDataSource + TDataSet implementa il pattern MVC. Ciò aiuta a separare la GUI e il codice di accesso ai dati.
  3. Il codice che convalida, riformula, esegue altri processi di elaborazione dei dati verrà chiamato in momenti ben definiti utilizzando i gestori di eventi. Ciò aiuta a centralizzare tale codice ed evitare confusioni con i luoghi in cui dovrebbe essere collocato. Ed evitare le confusioni con i momenti in cui chiamarlo.

Contro:

  1. Questo non è un approccio universale. Non è possibile associare un controllo compatibile con DB a un'origine dati diversa da TDataSet. Questo problema è stato risolto introducendo Live Data Binding in Delphi XE2.
  2. La programmazione guidata dagli eventi potrebbe confondere alcuni sviluppatori. E richiede la conoscenza di TDataSource, TDataSet, TField eventi e architettura, e portare a polemiche con i professionisti (3). Il codice guidato da un evento errato può essere un incubo.
+1

Sono un fan dei controlli sensibili ai dati ma non sono d'accordo con il tuo secondo professionista. Anche se i controlli implementano MVC (e non credo che lo facciano) ciò non significa che il tuo codice funzioni. È necessario fare uno sforzo per sovrapporre correttamente un'applicazione di controllo basata sui dati, non è un risultato automatico dell'utilizzo di controlli basati sui dati. – LachlanG

+0

@LachlanG: Delphi è un tipo di MVC-like se si utilizza TDataModule correttamente: Form-> controls + TDataSource; Form * .pas -> comando l'interfaccia e richiede i dati; Modulo dati: metodi per il recupero e l'aggiornamento dei dati che rispondono alle richieste del modulo. –

+0

@FabricioAraujo: Non sono assolutamente d'accordo. Non importa come li usi non sono niente come MVC. Non sto dicendo che MVC sia necessariamente migliore o peggiore dei componenti sensibili ai dati, solo che i due sono approcci molto diversi con pochissime cose in comune. – LachlanG

8

Entrambi i componenti DB-aware e non DB-aware presentano vantaggi e svantaggi, a seconda del tipo di applicazione che si sta sviluppando.

Per applicazioni di piccole e medie dimensioni, è consigliabile utilizzare componenti compatibili con DB, a meno che non vi siano requisiti o condizioni specifici in base al quale tali applicazioni sono operative. Ad esempio, una semplice applicazione di inserimento dati sarebbe più facile da sviluppare e mantenere con i componenti compatibili con DB. Anche le applicazioni di scala medio-grande, se correttamente progettate e implementate, avranno buone prestazioni con componenti compatibili con DB.

Tuttavia, quando si sviluppano applicazioni modulari, in particolare sistemi a più livelli, i componenti compatibili con DB possono avere un impatto negativo sulle prestazioni dell'applicazione e sulla manutenibilità. Ciò è particolarmente evidente con le applicazioni che accedono ai dati su Internet.Il motivo principale di ciò è dovuto al fatto che i componenti compatibili con DB richiedono una connessione costante al database, che può aumentare significativamente il traffico di rete.

L'utilizzo di componenti non sensibili al DB può essere più complesso in quanto richiede una migliore comprensione dei meccanismi sottostanti, ma in ambienti multi-utente e distribuiti su più livelli è scalabile molto meglio di qualsiasi altra cosa. Inoltre, puoi (e dovresti) separare il livello di accesso ai dati dal livello di presentazione (UI), che in seguito ti consentirà di apportare modifiche a un sottosistema (modulo, livello) senza dover modificare altro.

Oggi i dati possono essere ovunque e la maggior parte delle volte non vengono memorizzati su computer o reti locali. L'utilizzo di componenti compatibili con DB per accedere a tali dati può avere un impatto negativo significativo sulle prestazioni dell'applicazione e del database. Ci sono alcuni livelli di accesso ai dati che migliorano questo (UniDAC, AnyDac, ...), quindi l'utilizzo di componenti compatibili con DB può migliorare le prestazioni. Tuttavia, i componenti non compatibili con DB possono superare qualsiasi risultato.

Spetta allo sviluppatore decidere quale meccanismo utilizzare, perché, come ho detto, tutto dipende dal tipo di applicazione che si sta facendo e in quale ambiente funzionerà.

+1

+1 perché l'unica risposta al nome esplicito "[multi-tier] (http://blog.synopse.info/post/2010/08/19/How-to-implement-multi-tier-architecture-in-our- -SQLite3-Framework) "architettura a strati. In breve: i componenti DB sono un inferno da mantenere e scalare. E vale la pena parlare della [Service Oriented Architecture (SOA)] (http://blog.synopse.info/post/2010/07/18/DataSnap-like-Client-Server-JSON-RESTful-Services-in-Delphi- 7-2010) approccio. I componenti RAD DB sono tipici degli anni '90: è bello per la prototipazione e le piccole app, ma per le applicazioni aziendali, è da evitare nel 21 ° secolo. –

+0

+1 per multi-livello. –

+0

'I componenti compatibili con DB richiedono una connessione costante al database'. Solo vero se si collegano direttamente i componenti di accesso ai dati ai controlli. Altrimenti, il controllo DB chiederà a TDatasource dati e arriverà da qualsiasi cosa sia ... –

0

Aneddoto: un controllo di DB-aware volta incasinato nostro database InterBase: per indicare una o la data null 'vuota', il TcxDBDateEdit data di controllo di modifica (ExpressQuantumGrid) utilizza un valore negativo data, che rappresenta letteralmente "01/00/0000" .

Quindi, quando gli utenti hanno cancellato il campo di modifica della data nel modulo di immissione e hanno inviato questo valore nel database, i record sono diventati illeggibili (le istruzioni SELECT non sono riuscite).

+0

Aneddoto: una volta ho fatto un errore di copia e incolla e ho salvato il valore sbagliato nel campo sbagliato. In realtà l'ho fatto più di una volta. ;-) – LachlanG

+1

Un selettore DateTime è un tipo di controllo che mostra quanto sia accurato (o trascurato) il programmatore che lo ha creato. Ho visto molti DTP di DBAware che non sono in grado di gestire correttamente una situazione ** null **. –

+0

LachlanG ahia :) – mjn

1

Questo può essere un riporto dall'esperienza con Visual Basic. Come ricordo, anche Microsoft ha detto agli sviluppatori di non utilizzare i controlli compatibili con DB nel codice di produzione.

Delphi non ha mai avuto questo problema, ma come altri hanno detto, dipende dal tipo di progetto che si sta creando e dal fatto che si verifichino problemi di prestazioni.

Problemi correlati