Ένα 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
Αποσυμπιέσετε με ένα πρόγραμμα συμπίεσης πχ. WinZip τα περιεχόμενα του αρχείου ΑDONET Data Control.zip σε κάποιο φάκελο στο δίσκο. Θα δείτε να δημιουργείται ένας φάκελος με όνομα ADONET Data Control Test, ο οποίος περιέχει ένα project δείγματος χρήσης του control
καθώς και το παρόν readme αρχείο. Το project παρέχει μία δύο υποδειγματικές εφαρμογές διαχείρισης των εγγραφών μίας ΒΔ : μία για Cursor processing και μία για Batch Processing.
Ποιος δεν θυμάται το καλό 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)
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 στο έργο σας.
Αν στα 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
Πλέον υποστηρίζεται data-binding και στα ακόλουθα controls :
o
CheckBox
o
RadioButton
o
ListBox
o
CheckedListBox
o
Combobox
o
DateTimePicker
o
PictureBox
Νέες ιδιότητες :
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)
RsFindDuplicates : Βρίσκει τις διπλές καταχωρημένες τιμές ενός
πεδίου στο recordset. Η μέθοδος δέχεται το όνομα του πεδίου και
επιστρέφει
έναν πίνακα, τύπου Object, που περιλαμβάνει τις διπλές τιμές που
βρέθηκαν. Χρήσιμο για έλεγχο μοναδικότητας (πχ. κλειδιού) ή για κάθε περίπτωση
που επιθυμούμε πληροφόρηση διπλών τιμών σε κάποιο πεδίο. Φυσικά, αν σε μία
εγγραφή δεν υπάρχει καταχωρημένη τιμή (DbNull.Value)
αγνοείται.
Δείτε τον κώδικα της
υποδειγματικής εφαρμογής για τη χρήση της.
Νέο γεγονός
:
2)
OnMoving :
Ενεργοποιείται
όταν πρόκειται να γίνει μετακίνηση σε μία νέα εγγραφή χρησιμοποιώντας τα
κουμπιά μετακίνησης (μόνο για
Cursor Processing)
Νέο γεγονός :
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.
Διορθώθηκε ένα bug στην μέθοδο εύρεσης RsFind.