ADO.NET Data Control Ver 1.6    (ADONETDC)

 Ένα Data Control με δυνατότητες εφάμιλλες με το γνωστό Data Control της VB6 για διαχείριση απλών desktop Windows εφαρμογών Βάσεων Δεδομένων (ΒΔ). Επιπλέον, διευκολύνει και τη διασύνδεση (data-binding) με τα textboxes, comboboxes, checkboxes κ.α.  μίας φόρμας για την παρουσίαση των πεδίων μίας εγγραφής.  

Μπορεί να χρησιμοποιηθεί είτε για Cursor processing (δηλ. μία-μία εγγραφή, άποψη καρτέλας) είτε για Batch processing (διασύνδεση με DataGrid).

 

 

Χρήστος Μουρατίδης,  Μάρτιος 2006

 

Τι νέο υπάρχει στην έκδοση 1.2

Τι νέο υπάρχει στην έκδοση 1.3

Τι νέο υπάρχει στην έκδοση 1.4

Τι νέο υπάρχει στην έκδοση 1.5

Διορθώσεις στην έκδοση 1.6

 

Αποσυμπιέσετε με ένα πρόγραμμα συμπίεσης πχ. WinZip τα περιεχόμενα του αρχείου ΑDONET Data Control.zip σε κάποιο φάκελο στο δίσκο. Θα δείτε να δημιουργείται ένας φάκελος με όνομα  ADONET Data Control Test, ο οποίος περιέχει ένα project δείγματος χρήσης του control 

καθώς και το παρόν readme αρχείο. Το project παρέχει μία δύο υποδειγματικές εφαρμογές διαχείρισης των εγγραφών μίας ΒΔ : μία για Cursor processing και μία για Batch Processing.

 

Λίγα λόγια για το ADO.NET Data Control

Ποιος δεν θυμάται το καλό Data Control της VB6 όπου μπορούσε να το χρησιμοποιήσει για την εύκολη πλοήγηση και διαχείριση των εγγραφών μίας Βάσης Δεδομένων;  Στη VB.NET υπάρχει, βέβαια, το αντίστοιχο που βασίζεται στην τεχνολογία ADO αλλά δεν υπάρχει αντίστοιχο χρησιμοποιώντας την τεχνολογία ADO.NET. Αυτό οφείλεται στον προσανατολισμό της τεχνολογίας ADO.NET όπου είναι κυρίως η ασύγχρονη ενημέρωση μίας ΒΔ, που είναι αποθηκευμένη σε έναν server,  από μία client εφαρμογή (συνήθως ASP.NET εφαρμογή).

 

To βασικό εσωτερικό αντικείμενο που χρησιμοποιεί το control είναι ένα DataView.

 

Cursor Processing :

            Προσπάθησα, λοιπόν, να κατασκευάσω ένα ADO.NET Data Control με φιλοσοφία προσανατολισμένη στο Recordset και άμεση ενημέρωση της ΒΔ. Δηλαδή, μόλις εισαχθεί ή διορθωθεί μία εγγραφή  τότε ενημερώνεται αμέσως η ΒΔ. Παρότι, εσωτερικά χρησιμοποιεί τα αντικείμενα του ADO.NET (Connection, DataAdapter, CommandBuilder, DataView κλπ), στον προγραμματιστή παρέχει τη φιλοσοφία του Recordset. Βέβαια, ο προγραμματιστής μπορεί να χρησιμοποιήσει με τη δέουσα προσοχή, αν θέλει, τα αντικείμενα του ADO.NET καθόσον παρέχονται ως public αντικείμενα από τον control. 

 

Batch Processing :

            To control μπορεί να διασυνδεθεί με ένα DataGrid   Π.χ.:   DataGrid1.DataSource = DataControl.objDataView

      Ο χρήστης μπορεί να κάνει προσθήκες, μεταβολές, και διαγραφές στο DataGrid και καλώντας κατόπιν τη μέθοδο

      DataControl.RsUpdate ενημερώνεται η ΒΔ. Η μέθοδος DataControl.RsRefresh γεμίζει πάλι το εσωτερικό DataView με τα δεδομένα της Βάσης.

 

            Το control παρέχει πρόσβαση σε πίνακες/queries σε Access Database κάνοντας χρήση του OLEDB Provider και της μηχανής Jet 4.0 (Για Access 2000, 2002, 2003).

 

Παρακάτω παρουσιάζονται οι ιδιότητες, μέθοδοι και τα γεγονότα του control.

Ιδιότητες                                 

1)    BackColorOver     : Το background χρώμα των buttons πλοήγησης σε mouse over κατάσταση.

2)    BackColorDown     : Το background χρώμα των buttons σε mouse down κατάσταση.

3)    BackColorCaption  : Το background χρώμα του caption.

4)    Caption           : Το κείμενο του control

5)       AllowAdd          : Επιτρέπει ή όχι την εισαγωγή νέων εγγραφών

6)       AllowEdit         : Επιτρέπει ή όχι την τροποποίηση των εγγραφών

7)       AllowDelete       : Επιτρέπει ή όχι την εισαγωγή νέων εγγραφών

8)       SortText          : Το αλφαριθμητικό Sort, όπως έχει τεθεί στη μέθοδο RsSort (readOnly)

9)       FilterText        : Το αλφαριθμητικό Filter, όπως έχει τεθεί στη μέθοδο RsFilter (readΟnly)

10)    FindTypeForString    : Για string πεδία. Ο τύπος αναζήτησης, τύπου FindTypeForStringEnum, που θα χρησιμοποιηθεί στη μέθοδο RsFind.

   (νέο στην 1.3)

11)  MatchCaseForString   :  Για string πεδία. Αν θα κάνει ταίριασμα κεφαλαίων/πεζών στην αναζήτηση με τη μέθοδο (RsFind) (νέο στην

 1.3)

12)    PrimaryKeyIncrementalType : Καθορίζει αν το Primary key είναι αυτόματης αύξουσας (ΑutoIncremental) αρίθμησης ή όχι (Manual).

13)    RefreshAfterInsert   : Καθορίζει αν μετά την εισαγωγή μίας εγγραφής θα καλείται η μέθοδος RsRefresh, η οποία ανανεώνει το

  RecordSet με τα νέα δεδομένα της ΒΔ. Απαραίτητο αν έχετε ορίσει ένα AutoIncremental primary key, αλλιώς

  μπορεί να πάρετε μηνύματα τύπου «Concurrency Violation». Ισχύει μόνο για Cursor processing. (νέο στην 1.3)

14)    AutoUpdateAfterMove  : Καθορίζει αν θα γίνεται αυτόματα ενημέρωση της τρέχουσας εγγραφής στη Βάση, πατώντας τα κουμπιά

                                        μετακίνησης. Ισχύει μόνο για Cursor processing. (νέο στην 1.3)

15)    ConnectionString     : Επιστρέφει το ConnectionString του control, όπως έχει καθοριστεί κατά τη μέθοδο Open. (read-only) (νέο

   στην 1.3)

16)    HasChanges           : Επιστρέφει True αν έχουν γίνει αλλαγές στο Recordset μετά την τελευταία ενημέρωση της BΔ. (read-only) (νέο

  στην 1.3)

17)    ErrorMsg             : Το μήνυμα σφάλματος σε κάποια ενέργεια διαχείρισης.  (νέο στην 1.3)

 

Μέθοδοι

1)    Open            : Ανοίγει ένα RecordSet από τη ΒΔ (πίνακα ή query). Δέχεται ένα ConnectionString και την SQL

πρόταση επιλογής εγγραφών ή το όνομα ενός πίνακα/query (Εσωτερικά, δημιουργεί τα σχετικά ADO.NET   

   αντικείμενα).

2)    Close           : Κλείνει το RecordSet και τη σύνδεση.

3)    RsRefresh       : Ξαναφέρνει τις εγγραφές από τη ΒΔ (κι επαναδημιουργεί το RecordSet και τα σχετικά ADO.NET

   αντικείμενα.  

4)    RsEmpty         : Ελέγχει αν το Recordset είναι άδειο.

5)    RsMode          : Επιστρέφει την τρέχουσα κατάσταση του Recordset (αν είναι σε Αdd, Edit ή Normal Mode).

6)    BindData        : Διασυνδέει ένα control μίας φόρμας με ένα πεδίο.

7)    RsPosition      : Επιστρέφει την τρέχουσα θέση της εγγραφής στο Recordset (Ξεκινώντας από το 0).

8)    RsCount         : Επιστρέφει το πλήθος των εγγραφών του Recordset.     

9)    RsFind          : Αναζητά μία εγγραφή στο Recordset με βάση μία ή περισσότερες τιμές κριτηρίων. 

10)RsSort          : Ταξινομεί το Recordset με βάση ένα ή περισσότερα πεδία.

11)RsFilter        : Φιλτράρει τις εγγραφές του Recordset σύμφωνα με ένα αλφαριθμητικό φιλτραρίσματος (π.χ.

ΠΟΛΗ=’ΑΘΗΝΑ’”).

12)RsFindDuplicates: Βρίσκει τις διπλές καταχωρημένες τιμές ενός πεδίου (π.χ. διπλοί κωδικοί). (νέο στην έκδοση 1.4)   

13)RsGotoRecord    : Μεταβαίνει σε μία εγγραφή με βάση τον αριθμό της στο Recordset.

14)RsMoveFirst     : Μεταβαίνει στην πρώτη εγγραφή.

15)RsMoveLast      : Μεταβαίνει στην τελευταία εγγραφή. 

16)RsMoveNext      : Μεταβαίνει στην επόμενη εγγραφή.

17)RsMovePrevious  : Μεταβαίνει στην προηγούμενη εγγραφή.

18)RsAddNew        : Προσθέτει μία νέα εγγραφή. Τα διασυνδεόμενα textboxes και άλλα controls γίνονται κενά για να

    δεχτούν τις τιμές των πεδίων. Συνιστάται να χρησιμοποιείται μόνο σε Cursor processing.

19)RsUpdate        : Ενημερώνει άμεσα στη ΒΔ την εγγραφή /εγγραφές. 

20)RsCancelUpdate  : Ακυρώνει την εισαγωγή/ διόρθωση της τρέχουσας εγγραφής..

21)RsDelete        : Διαγράφει την τρέχουσα εγγραφή.

22)ExecuteCommand  :  Εκτελεί ένα ερώτημα ενημέρωσης / διαγραφής (Update / Delete SQL statement). Χρησιμοποιείται η

τρέχουσα σύνδεση. (νέο στην 1.3)

23)ExecuteScalar    : Επιστρέφει μία τιμή που είναι αποτέλεσμα ενός στατιστικού ερωτήματος επιλογής (Aggregate SQL

   statement). Π.χ. “Select Count(*) from ΜΑΘΗΤΕΣ”  θα επιστρέψει το πλήθος των μαθητών. 

    Χρησιμοποιείται η τρέχουσα σύνδεση   (νέο στην 1.3).

24)ExecuteReader    : Επιστρέφει ένα αντικείμενο DataReader με βάση ένα Select SQL statement. Χρησιμοποιείται η τρέχουσα σύνδεση

(νέο στην 1.3).

Γεγονότα

 

1)    ΟnMoveComplete() : Ενεργοποιείται όταν γίνεται επιτυχώς μετάβαση σε μία εγγραφή πατώντας τα κουμπιά μετακίνησης. 

Μόνο για Cursor processing.

2)    ΟnMoving()       : Ενεργοποιείται όταν πρόκειται να γίνει μετάβαση σε μία εγγραφή πατώντας τα κουμπιά μετακίνησης.

   Παρέχει την κατεύθυνση της μετακίνησης ενώ έχουμε τη δυνατότητα να ακυρώσουμε τη μετακίνηση. 

Μόνο για Cursor processing. (νέο στην 1.5)

3)    OnDataError()     : Ενεργοποιείται όταν συμβεί κάποιο σφάλμα δεδομένων. Η ιδιότητα ErrorMsg περιέχει το μήνυμα

λάθους. (νέο στην 1.3)

 

Public Αντικείμενα

 

4)    objConnection  : Το αντικείμενο OleDbConnection για τη σύνδεση με τη ΒΔ.

5)    objDataAdapter : Το αντικείμενο OleDbDataAdapter για την επικοινωνία DataSet και ΒΔ.

6)    objCommBuilder : Το αντικείμενο OleDbCommandBuilder για την αυτόματη δημιουργία των INSERT,UPDATE,DELETE εντολών

                     του DataAdapter.

7)    objDataSet     : Το αντικείμενο DataSet.

8)    objDataView    : Το αντικείμενο DataView, το οποίο περιέχει τις εγγραφές του RecordSet.

9)     Απαρίθμηση FindTypeForStringEnum για καθορισμό του τύπου Αναζήτησης (Find) για string πεδία. Περιλαμβάνει τα:

       Equal       : Για να βρούμε αν η τιμή του πεδίου ισούται με τη συγκεκριμένη τιμή αναζήτησης.

StartsWith  : Για να βρούμε αν η τιμή του πεδίου ξεκινάει με τη συγκεκριμένη τιμή αναζήτησης.

EndsWith    : Για να βρούμε αν η τιμή του πεδίου τελειώνει με τη συγκεκριμένη τιμή αναζήτησης.

Contains    : Για να βρούμε αν η τιμή του πεδίου περιέχει τη συγκεκριμένη τιμή αναζήτησης.  (νέο στην 1.3)

   9) Απαρίθμηση  PrimaryKeyIncrementalTypeEnum για καθορισμό του τύπου του Primary key : Περιλαμβάνει τα

        AutoIncremetal    : To Primary key είναι ένα πεδίο αυτόματης αρίθμησης.

        ManualIncremental : To Primary key είναι ένα πεδίο που η αρίθμησή του καθορίζεται manual. (νέο στην 1.3)

10)  Απαρίθμηση  MovingDirectionEnum για τη μετακίνηση σε μία εγγραφή. Χρησιμοποιείται από το γεγονός OnMoving

        FirstRec     : Πρόκειται να γίνει μετακίνηση στην πρώτη εγγραφή

        PreviousRec  : Πρόκειται να γίνει μετακίνηση στην προηγούμενη εγγραφή

        NextRec      : Πρόκειται να γίνει μετακίνηση στην επόμενη εγγραφή

 LastRec      : Πρόκειται να γίνει μετακίνηση στην τελευταία εγγραφή

        GotoRec      : Πρόκειται να γίνει μετακίνηση σε κάποια εγγραφή με τη μέθοδο RsGotoRecord

        FindRec      : Πρόκειται να γίνει μετακίνηση σε κάποια εγγραφή με τη μέθοδο RsFind

        AddNewRec    : Πρόκειται να γίνει μετακίνηση σe νέα εγγραφή (όταν καλείται η μέθοδος RsAddNew) (νέο στην 1.5)

 

Παρατηρήσεις

Προσθέστε στο ToolBox της VB.NET το ADONETDC και χρησιμοποιήστε το ελεύθερα στις εφαρμογές σας. Το assembly αρχείο ADONETDC.dll θα το βρείτε στο φάκελο bin.

 

Προσοχή : Επειδή το control χρησιμοποιεί Lightbuttons, βεβαιωθείτε ότι έχετε ήδη προσθέσει μία αναφορά (reference) προς το LightButton.dll στο έργο σας.

ΠΡΟΒΛΗΜΑ ΜΕ ΤΟ PROJECT ΔΕΙΓΜΑΤΟΣ ΧΡΗΣΗΣ - ΛΥΣΗ.

 

Αν στα References του project δείγματος χρήσης εμφανίζει με κίτρινα θαυμαστικά τα adonet data control και lightbutton τότε πρέπει να ενημερώσετε τα Reference Path του project ώστε να ψάχνει στο φάκελο που έχετε βάλει τα dll των controls.

 

1) Στο Solution Explorer κάντε δεξί κλικ στο prοject και επιλέξτε Properties.

2) Στο παράθυρο ιδιοτήτων του project που ανοίγει, πηγαίνετε στο τμήμα Common Properties και Reference Path.

3) Δεξιά, πατήστε το browse button (...) για να βρείτε το Folder όπου βρίσκεται το καθένα assembly dll των controls στον δικό σας υπολογιστή.

4) Πατήστε το button Update. Σώστε το project, κλείστε το και ξανανοίξτε το. Τώρα, πρέπει να εμφανίζονται όλα κανονικά.  

 

Εναλλακτικά, και πιο ανώδυνα κάντε το εξής :

 

*        Ανοίξτε το αρχείο ADO NET DataControl Test.vbproj με τo WordPad. Βρείτε τις παρακάτω γραμμές που αναφέρονται στα References του project :

 

    <Reference

                    Name = "adonet data control"

                    AssemblyName = "ADONET Data Control"

                    HintPath = "e:\vb net projects\adonet data control\bin\adonet data control.dll"

                />

                <Reference

                    Name = "LightButton"

                    AssemblyName = "LightButton"

                    HintPath = "E:\VB Net Projects\LightButton\bin\LightButton.dll"

                />

 

Διορθώστε τα paths που φαίνονται με τα βέλη ώστε να ανταποκρίνονται σε αυτά, όπου έχετε βάλει τα σχετικά dll των controls, στο δικό σας Η/Υ.

Επικοινωνία

Για οποιεσδήποτε παρατηρήσεις στείλτε e-mail στην παρακάτω διεύθυνση.

 

mouratx@yahoo.com

 

Δείγμα φόρμας  καρτέλας :

 

 

Δείγμα φόρμας  DataGrid :

 

Τι νέο υπάρχει στην έκδοση 1.2

 

Πλέον υποστηρίζεται data-binding και στα ακόλουθα controls :

 

o       CheckBox

o       RadioButton

o       ListBox

o       CheckedListBox

o       Combobox

o       DateTimePicker

o       PictureBox

           

Τι νέο υπάρχει στην έκδοση 1.3

 

Νέες ιδιότητες :

 

1.     FindTypeForString    : Για string πεδία. Ο τύπος αναζήτησης, τύπου FindTypeForStringEnum, που θα χρησιμοποιηθεί στη μέθοδο RsFind.

2.     MatchCaseForString   :  Για string πεδία. Αν θα κάνει ταίριασμα κεφαλαίων/ πεζών στην αναζήτηση με τη μέθοδο (RsFind)

3.     PrimaryKeyIncrementalType : Καθορίζει αν το Primary key είναι αυτόματης αύξουσας (ΑutoIncremental) αρίθμησης ή όχι (Manual).

4.     RefreshAfterInsert   : Καθορίζει αν μετά την εισαγωγή μίας εγγραφής θα καλείται η μέθοδος RsRefresh, η οποία ανανεώνει το

RecordSet με τα νέα δεδομένα της ΒΔ. Απαραίτητο αν έχετε ορίσει ένα AutoIncremental primary key, αλλιώς

μπορεί να πάρετε μηνύματα τύπου «Concurrency Violation». Ισχύει μόνο για Cursor processing)

5.     AutoUpdateAfterMove  : Καθορίζει αν θα γίνεται αυτόματα ενημέρωση της τρέχουσας εγγραφής στη Βάση, πατώντας τα κουμπιά

Μετακίνησης. Ισχύει μόνο για Cursor processing.

6.     ConnectionString     : Επιστρέφει το ConnectionString του control, όπως έχει καθοριστεί κατά τη μέθοδο Open. (read-only)

7.     HasChanges           : Επιστρέφει True αν έχουν γίνει αλλαγές στο Recordset μετά την τελευταία ενημέρωση της BΔ. (read-only) 

8.    ErrorMsg             : Το μήνυμα σφάλματος σε κάποια ενέργεια διαχείρισης. 

 

Νέες μέθοδοι :

 

1.  ExecuteCommand    :  Εκτελεί ένα ερώτημα ενημέρωσης / διαγραφής (Update / Delete SQL statement). Χρησιμοποιείται η τρέχουσα

σύνδεση.

2.  ExecuteScalar    : Επιστρέφει μία τιμή που είναι αποτέλεσμα ενός στατιστικού ερωτήματος επιλογής (Aggregate SQL statement).

Π.χ. “Select Count(*) from ΜΑΘΗΤΕΣ”  θα επιστρέψει το πλήθος των μαθητών. Χρησιμοποιείται η τρέχουσα σύνδεση  

3.    ExecuteReader    : Επιστρέφει ένα αντικείμενο DataReader με βάση ένα Select SQL statement. Χρησιμοποιείται η τρέχουσα σύνδεση

 

Νέο γεγονός :

 

1.  OnDataError()     : Ενεργοποιείται όταν συμβεί κάποιο σφάλμα δεδομένων. Η ιδιότητα ErrorMsg περιέχει το μήνυμα

λάθους.

 

Νέα public αντικείμενα :

 

1.   Απαρίθμηση   FindTypeForStringEnum για καθορισμό του τύπου Αναζήτησης (Find) για string πεδία. Περιλαμβάνει τα:

Equal       : Για να βρούμε αν η τιμή του πεδίου ισούται με τη συγκεκριμένη τιμή αναζήτησης.

StartsWith  : Για να βρούμε αν η τιμή του πεδίου ξεκινάει με τη συγκεκριμένη τιμή αναζήτησης.

EndsWith    : Για να βρούμε αν η τιμή του πεδίου τελειώνει με τη συγκεκριμένη τιμή αναζήτησης.

Contains    : Για να βρούμε αν η τιμή του πεδίου περιέχει τη συγκεκριμένη τιμή αναζήτησης. 

 

2.   Απαρίθμηση  PrimaryKeyIncrementalTypeEnum για καθορισμό του τύπου του Primary key : Περιλαμβάνει τα

AutoIncremental    : To Primary key είναι ένα πεδίο αυτόματης αρίθμησης.

ManualIncremental : To Primary key είναι ένα πεδίο που η αρίθμησή του καθορίζεται manual.

 

 

 

Τι νέο υπάρχει στην έκδοση 1.4

 

Νέα μέθοδος :

 

1)    RsFindDuplicates :  Βρίσκει τις διπλές καταχωρημένες τιμές ενός πεδίου στο recordset. Η μέθοδος δέχεται το όνομα του πεδίου και

 επιστρέφει έναν πίνακα, τύπου Object, που περιλαμβάνει τις διπλές τιμές που βρέθηκαν. Χρήσιμο για έλεγχο μοναδικότητας (πχ. κλειδιού) ή για κάθε περίπτωση που επιθυμούμε πληροφόρηση διπλών τιμών σε κάποιο πεδίο. Φυσικά, αν σε μία εγγραφή δεν υπάρχει καταχωρημένη τιμή (DbNull.Value) αγνοείται.

                           Δείτε τον κώδικα της υποδειγματικής εφαρμογής για τη χρήση της.

 

Νέο γεγονός :

 

2)    OnMoving :     Ενεργοποιείται όταν πρόκειται να γίνει μετακίνηση σε μία νέα εγγραφή χρησιμοποιώντας τα κουμπιά μετακίνησης (μόνο για

Cursor Processing)

Τι νέο υπάρχει στην έκδοση 1.5

 

Νέο γεγονός :

 

       OnMoving (Direction, CancelMove) όπου :

Direction : Δείχνει την κατεύθυνση της μετακίνησης. Οι τιμές προέρχονται από την απαρίθμηση MovingDirectionEnum

              CancelMove : Μπορούμε να ακυρώσουμε τη μετακίνηση θέτοντας True.

 

Με το γεγονός αυτό μπορούμε να εκτελέσουμε κάποιες ενέργειες (π.χ. εγκυρότητα της τρέχουσας εγγραφής) πριν ξεκινήσει να μετακινηθεί σε μία νέα εγγραφή (Για cursor processing.).

 

Νέα Απαρίθμηση  :

 

 MovingDirectionEnum για τη μετακίνηση σε μία εγγραφή. Χρησιμοποιείται από το γεγονός OnMoving

        FirstRec     : Πρόκειται να γίνει μετακίνηση στην πρώτη εγγραφή

        PreviousRec  : Πρόκειται να γίνει μετακίνηση στην προηγούμενη εγγραφή

        NextRec      : Πρόκειται να γίνει μετακίνηση στην επόμενη εγγραφή

 LastRec      : Πρόκειται να γίνει μετακίνηση στην τελευταία εγγραφή

        GotoRec      : Πρόκειται να γίνει μετακίνηση σε κάποια εγγραφή με τη μέθοδο RsGotoRecord

        FindRec      : Πρόκειται να γίνει μετακίνηση σε κάποια εγγραφή με τη μέθοδο RsFind

        AddNewRec    : Πρόκειται να γίνει μετακίνηση σe νέα εγγραφή (όταν καλείται η μέθοδος RsAddNew)

 

Η μέθοδος RsAddNew  μπορεί, τώρα,  να επιστρέψει True /False. Κάνετε τις ενέργειες στο έργο σας, που ακολουθούν τη μέθοδο, εφόσον επιστρέψει True.

 

Διορθώσεις στην έκδοση 1.6

 

Διορθώθηκε ένα bug στην μέθοδο εύρεσης RsFind.