Download - Σημειώσεις για βάσεις δεδομένων Client Server

Transcript
Page 1: Σημειώσεις για βάσεις δεδομένων Client Server

Τεχνικός Εφαρμογών Πληροφορικής Γλώσσα Προγραμματισμού V IEK ΣΥΡΟΥ 2013

[email protected] 27-Μαϊ-14 Σελ. 1

Γλώσσες Προγραμματισμού V Client Server με εργαλεία IDE στη διαχείριση RDBMS

1. Εισαγωγή Το μάθημα αυτό είναι μια λογική συνέχεια των μαθημάτων σε βάσεις δεδομένων και γλώσσες προγραμματισμού. Από τη μια

μεριά, λοιπόν, αναπτύσσουμε εφαρμογές σε μια "κλασική" γλώσσα προγραμματισμού, όπως η C. Αυτές οι εφαρμογές εκτελού-

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

λογισμούς στον επεξεργαστή του υπολογιστή και προβάλλοντας αποτελέσματα στην οθόνη. Από την άλλη μεριά, υπάρχουν δε-

δομένα, πληροφορίες. Πολλά. Και μοιραζόμενα σε πολλούς χρήστες. Οι οποίοι μπορούν και να τα ενημερώνουν. Ταυτόχρονα.

Όλα αυτά σημαίνουν βάση δεδομένων. Μόνο που οι απλοί χρήστες δεν είναι σε θέση να γράφουν εντολές χειρισμού δεδομένων

της SQL για να κάνουν δοσοληψίες, όπως είδαμε στα μαθήματα 'Βάσεις Δεδομένων'. Θα τους φτιάξουμε, λοιπόν, ωραίες και

απλές εφαρμογές με γραφικά, μενού, κ.λπ., που πίσω από την κουρτίνα θα επικοινωνούν με τη βάση δεδομένων. Αυτός είναι ο

στόχος του μαθήματος.

Θεωρείται δεδομένο ότι τα δεδομένα δεν είναι

προσωπικά, γιατί τότε θα αρκούσε μια λύση Mi-

crosoft Access: σε ένα αρχείο θα αποθηκεύονταν

τα δεδομένα σε πίνακες και θα φτιάχναμε και

μερικές φόρμες / αναφορές για τον απλό χρήστη.

Εδώ θα ασχοληθούμε με μεγαλύτερης κλίμακας

καταστάσεις. Μιλάμε για οργανισμούς που λει-

τουργούν ένα τοπικό δίκτυο υπολογιστών και οι

υπάλληλοί τους χειρίζονται ένα πληροφοριακό

σύστημα1. Καθένας έχει συγκεκριμένες ευθύνες

και αρμοδιότητες και το πληροφοριακό σύστημα

επιβάλλει τις επιχειρησιακές διαδικασίες – τον

"σωστό" τρόπο που γίνεται η δουλειά.

Να λοιπόν το προσδοκώμενο αποτέλεσμα από

αυτό το μάθημα: να φτιάξουμε εφαρμογές, απλές

στη χρήση (ο σωστός όρος είναι 'idiot-proof',

δηλαδή ανθεκτικές στη χαζομάρα), που θα επι-

βάλλουν ότι η δουλειά θα διεκπεραιώνεται σωστά

(ή καθόλου), οι πληροφορίες που συλλέγονται θα

είναι πάντοτε ορθές, και τα αποτελέσματα θα διαχέονται στους αρμόδιους και μόνον.

Ας τοποθετήσουμε τώρα το στόχο μας στο πλαίσιο λειτουργίας ενός τυπικού οργανισμού. Η υποδομή είναι το τοπικό δίκτυο πά-

νω στο οποίο κρέμονται οι σταθμοί εργασίας των χρηστών και ο εξυπηρετητής (server) που λειτουργεί αδιάλειπτα, αξιόπιστα και

σε προστατευμένο περιβάλλον. Οι σταθμοί εργασίας είναι οι πελάτες που "καταναλώνουν" τις υπηρεσίες που "σερβίρει" ο εξυπη-

ρετητής2.

1.1 Μοντέλο εξυπηρετητή αρχείων

Ας πούμε ότι στοχεύετε σε μια απλή εφαρμογή που λειτουργεί σε μια μικρή

επιχείρηση ή σε μια ομάδα 3-10 ατόμων. Κατά πάσα πιθανότητα το μοντέλο

πελάτη εξυπηρετητή είναι ακριβό, γιατί απαιτεί ένα εξυπηρετητή που υπο-

λειτουργεί, κοστίζει αρκετά λόγω προμήθειας εξοπλισμού και αδειών χρή-

σης λογισμικού, ενώ πάνω του δεν μπορεί να εργαστεί κάποιος.

Για παράδειγμα, σε ένα λογιστικό γραφείο συνεργάζονται τρεις λογιστές

και δυο υπάλληλοι και θέλουν να μοιράζονται το κοινό βιβλίο διευθύνσεων.

Ο καθένας τους έχει έναν υπολογιστή, όπως φαίνεται στην Εικόνα 2. Επιλέ-

γουν τον υπολογιστή του πιο εργατικού τύπου που έρχεται πρωί-πρωί και

φεύγει τελευταίος, ενώ δεν εγκαθιστά παιχνίδια για να παίζει όλη τη μέρα.

Σε αυτόν τον υπολογιστή διαμοιράζουν έναν φάκελο με πλήρη δικαιώματα

ανάγνωσης & εγγραφής και τοποθετούν εκεί μέσα τα κοινόχρηστα αρχεία.

Αυτός εκτελεί χρέη εξυπηρετητή αρχείων.

1 Βέβαια, όπως βλέπετε στην Εικόνα 1, το τοπικό δίκτυο περιλαμβάνει και μια σύνδεση στο Διαδίκτυο, γιατί κάποιοι υπάλληλοι,

πχ οι πωλητές, είναι έξω, στο δρόμο. Επίσης, εξωτερικοί συνεργάτες εργάζονται από το σπίτι τους. 2 Στις ημέρες μας θεωρείται δεδομένο ότι η γκάμα των πελατών δεν εξαντλείται στους επιτραπέζιους και φορητούς υπολογιστές.

Μπορεί να λειτουργούν σε ετερογενείς πλατφόρμες υλικού-λογισμικού, όπως ταμπλέτες, έξυπνα κινητά και αυτή η διαφοροποίη-

ση εισάγει πολυπλοκότητα λόγω των διαφορετικών χαρακτηριστικών των συσκευών, λειτουργικού συστήματος, κ.ά.

Εικόνα 1 Εταιρικό δίκτυο

Εικόνα 2 Ομότιμο δίκτυο

Page 2: Σημειώσεις για βάσεις δεδομένων Client Server

IEK ΣΥΡΟΥ 2013 Γλώσσα Προγραμματισμού V Τεχνικός Εφαρμογών Πληροφορικής

Σελ. 2 27-Μαϊ-14 [email protected]

Μεταξύ των υπολογιστικών φύλλων και των εγγράφων κειμένου, είναι και μια βάση δεδομένων, ας πούμε το PEL-

DAT.ACCDB. Εκεί συντηρούνται οι διευθύνσεις των πελατών της επιχείρησης – οι πίνακες δηλαδή.

Από την άλλη μεριά, σε όλους τους υπολογιστές εγκαθίσταται το αρχείο PEL-APP.ACCDB, που αποφεύγω να το πω

ΒΔ (παρότι τεχνικά είναι, ως αρχείο της Access3), διότι περιέχει τις φόρμες

και τις εκθέσεις, αλλά όχι δεδομένα, αλλιώς θα ήταν σκορποχώρι. Η πρόσβα-

ση στα δεδομένα εξασφαλίζεται με αυτό που η Access ονομάζει συνδεδεμέ-

νοι πίνακες (attached tables). Παρεμπιπτόντως, η πηγή των συνδεδεμένων

πινάκων δεν είναι απαραίτητο να είναι ένα αρχείο της Access – μπορεί να

είναι ένα υπολογιστικό φύλλο του Excel, ή και ένα απλό αρχείο γραμμογρα-

φημένου κειμένου.

Αυτή η ιδέα, δηλαδή να μπορείς από ένα πρόγραμμα να διαχειρίζεσαι δεδο-

μένα που είναι αποθηκευμένα σε ένα άλλο αρχείο κι ενδεχομένως φτιαγμένα

από μια άλλη εφαρμογή είναι μεγάλη εφεύρεση, τόσο μεγάλη όσο και η δυ-

νατότητα αντιγραφής και επικόλλησης (copy&paste μέσω clipboard) που

έφεραν τα Windows.

Ο πίνακας tblAddresses που φαίνεται στην Εικόνα 3 (παρατηρήστε το γαλά-

ζιο βελάκι), συνδέεται με την βάση δεδομένων του αρχείου PEL-

DAT.ACCDB. Πετύχαμε ο κάθε χρήστης να λειτουργεί τοπικά στον υπολο-

γιστή του την εφαρμογή και τα δεδομένα να είναι κοινά για όλους. Εύκολο, ε;

Ναι, αλλά παρά το εντυπωσιακό και άμεσο αποτέλεσμα, η προσέγγιση αυτή

παρουσιάζει προβλήματα:

Καθένας μπορεί να σβήσει την κεντρική βάση δεδομένων, αφού είναι

ένα απλό αρχείο και όλοι οι χρήστες υποχρεωτικά έχουν πλήρη πρό-

σβαση (για ανάγνωση, εγγραφή, διαγραφή) σε αυτό.

Όσο κάποιος χρήστης είναι συνδεδεμένος με αυτό το αρχείο, δεν μπορεί

να ληφθεί αντίγραφο ασφαλείας του (backup).

Η ασφάλεια μπάζει από παντού: οποιοσδήποτε συνδεθεί στο τοπικό δί-

κτυο, ακόμα κι αν δεν έχει εγκατεστημένη την PEL-APP.ACCDB, μπο-

ρεί να ανοίξει τον πίνακα της βάσης δεδομένων και να δει ή και να πα-

ραποιήσει τα στοιχεία του.

Πάντως, ο πιο ύπουλος εχθρός αυτής της προσέγγισης είναι η ενδεχόμενη

επιτυχία της. Αν ξεκινήσει μια εφαρμογή με το μοντέλο εξυπηρετητή αρ-

χείων (file server), λόγω απλότητας, μπορεί να γίνει δημοφιλής. Να την λειτουργούν όλο και περισσότεροι χρήστες και να εξαρ-

τώνται προοδευτικά ολοκληρωτικά για τη διεκπεραίωση της δουλειάς τους. Τότε θα αρχίσουν οι καθυστερήσεις απόκρισης, οι

διαγραφές κατά λάθος, κ.ο.κ. Γκρίνια!

Και βέβαια, η λύση ονομάζεται μοντέλο πελάτη/εξυπηρετητή. Αλλά για να μην πέσουμε κατευθείαν στα βαθειά, ας κάνουμε ένα

άλλο ένα παράδειγμα με εξυπηρετητή αρχείων για μια …

1.2 ΒΔ για πωλήσεις

Ένα μικρό εμπορικό κατάστημα θέλει να καταγράφει

τι πουλάει στους πελάτες του. Θα ξεκινήσουμε με την

πιο απλή εκδοχή της ανάλυσης του σεναρίου, όπου

αναγνωρίζουμε δυο βασικές οντότητες τους πελάτες

και τις πωλήσεις (Εικόνα 5). Προφανώς ένας πελάτης μπορεί να

συμμετέχει

σε πολλές

πωλήσεις.

Προτού να

προχωρήσου

με στην υλο-

ποίηση, σχεδιάστε στο χαρτί πώς πρέπει να διαμορφωθούν οι πί-

νακες και τα κλειδιά τους (πρωτεύοντα και ξένα).

Είναι ώρα να δημιουργήσετε μια νέα ΒΔ στην Access την POL-

DAT.MDB που περιέχει δυο πίνακες: τον tblPelates που έχει τα

στοιχεία των πελατών και τον tblPoliseis που αποθηκεύει πότε

πωλήθηκε, ποιο εμπόρευμα και σε ποια τιμή (δείτε Εικόνα 4).

3 Οι νεότερες εκδόσεις της Microsoft Access δημιουργούν αρχεία με κατάληξη ACCDB (από το ACCess DataBase), αν και συνε-

χίζουν να υποστηρίζουν τα παλιά MDB (από το Microsoft DataBase), δηλαδή μπορούν να τα ανοίγουν και να τα χρησιμοποιούν

ως πηγή δεδομένων), αλλά δεν επιτρέπεται η αλλαγή της δομής των πινάκων, ερωτημάτων, κ.λπ.

Εικόνα 3 Συνδεδεμένος πίνακας

Εικόνα 4 Πεδία των πινάκων

Εικόνα 5 Οντότητες και σχέσεις

Πελάτες Πωλήσεις 1 ∞

Page 3: Σημειώσεις για βάσεις δεδομένων Client Server

Τεχνικός Εφαρμογών Πληροφορικής Γλώσσα Προγραμματισμού V IEK ΣΥΡΟΥ 2013

[email protected] 27-Μαϊ-14 Σελ. 3

Μετά φτιάξτε ένα νέο αρχείο της Access POL-APP.MDB και εισάγετε ως συνδεδεμένους πίνακες τους δυο πίνακες από το POL-

DAT.MDB.

Ανάλογα με την προσοχή που έχετε δώσει στη σχεδίαση των πινάκων (με λεζάντες, κανόνες επικύρωσης, απαιτείται, κλπ), θα

είναι εύκολο να φτιάξετε δυο φόρμες για την διαχείριση των δεδομένων τους. Ακολούθως, και δυο εκθέσεις για την εκτύπωση

των δεδομένων τους.

Για να κάνουμε το αποτέλεσμα να δείχνει περισσότερο ως "εφαρμογή"

μπορούμε να φτιάξουμε μια φόρμα επιλογών (δείτε Εικόνα 6) από την ο-

ποία θα ανοίγει ο χρήστης τις υπάρχουσες δυο φόρμες και εκθέσεις, μαζί με

ένα πλήκτρο τερματισμού της εφαρμογής. Αυτή τη φόρμα μπορείτε να τη

φτιάξετε αυτόματα με το 'Διαχείριση πίνακα επιλογών', ή μια και θέλουμε

να βουτήξουμε τα πόδια μας στη Visual Basic, να γράψετε εντολές

Docmd.OpenForm και Docmd.OpenReport μέσα στα συμβάντα Click των

κουμπιών στη φόρμα. Τέλος ορίζεται να εμφανίζεται η φόρμα του κύριου

μενού όταν ανοίγει το αρχείο.

Έτοιμη και η δεύτερη file server εφαρμογή σας. Τα δεδομένα της είναι σε

ξεχωριστή βάση δεδομένων (στο αρχείο POL-DAT.MDB) που μπορείτε να

την ‘ακουμπήσετε’ σε ένα μοιραζόμενο φάκελο για να την βλέπουν πολλοί.

Την εφαρμογή (αρχείο POL-APP.MDB) μπορείτε να την τοποθετήσετε ο

καθένας τοπικά στον υπολογιστή του και να ενημερώσετε (από την επιλογή

'Διαχείριση συνδεδεμένων πινάκων') για τη θέση της κοινόχρηστης ΒΔ για να "βλέπει" τα δεδομένα της.

1.3 Μοντέλο πελάτη/εξυπηρετητή

Ας δούμε το υπολογιστικό περιβάλλον που 'ζει' ένα σύστημα πελάτη/εξυπηρετητή. Στο τοπικό δίκτυο (Local Area Network,

LAN) είναι συνδεδεμένος τουλάχιστον ένας εξυπηρετητής που "τρέχει" ένα δικτυακό λειτουργικό σύστημα, πχ Microsoft

Windows Server. Πάνω σε ένα τέτοιο μηχάνημα εκτελείται και ένα στιγμιότυπο του Συστήματος Διαχείρισης Βάσεων Δεδομένων

(ΣΔΒΔ),

όπως τα

Microsoft

SQL Server,

Oracle,

MySQL. Το

ΣΔΒΔ

εκτελείται

στο

παρασκήνιο

ως μια υπηρεσία, γι' αυτό κι αν συνδεθείτε στην επιφάνεια εργασίας του εξυπηρετητή ίσως και να μην δείτε καμιά ένδειξη ότι

στην πραγματικότητα είναι (και) database server. Αν θέλετε να το διακριβώσετε, πρέπει να πάτε από τις διεργασίες ή να ανοίξετε

την κονσόλα διαχείρισης του ΣΔΒΔ και να ελέγξετε το όνομα του μηχανήματος στο οποίο τρέχει ο εξυπηρετητής του.

Από την άλλη μεριά του καλωδίου υπάρχουν οι πελάτες που πρέπει να εκτελούν κάποιο λογισμικό εφαρμογής για να κάνουν κάτι

χρήσιμο, όπως την εμπορική διαχείριση ενός καταστήματος, τα λογιστικά ενός επαγγελματία, κ.λπ.

Για να επικοινωνήσουν οι δυο μεριές πρέπει να

μιλούν και να καταλαβαίνουν μια κοινή γλώσσα που

λέγεται πρωτόκολλο προσπέλασης δεδομένων (data

access API, το API βγαίνει από Application

Programmer's Interface). Για να γίνουμε πιο

συγκεκριμένοι, σε μας το ΣΔΒΔ είναι ο SQL Server

Express, ο πελάτης είναι γραμμένος σε Visual Basic

και το πρωτόκολλο προσπέλασης είναι το ADO

(ActiveX Data Objects – όχι πως έχει καμιά

σημασία). Οι εντολές που περνάνε από το τούνελ που

συνδέει τα δυο άκρα είναι γραμμένες φυσικά σε

γλώσσα SQL.

Ας δούμε λοιπόν τις αρμοδιότητες: ο εξυπηρετητής επεξεργάζεται στο παρασκήνιο τα δεδομένα μέσα στις ΒΔ του ΣΔΒΔ

επιβάλλοντας ότι ανά πάσα στιγμή βρίσκονται σε συνεπή κατάσταση, σύμφωνα με τους κανόνες ακεραιότητας. Επίσης, είναι

υπεύθυνος για τη διατήρησή τους σε αποθηκευτικά μέσα. Στο προσκήνιο που λειτουργεί ο πελάτης, διεκπεραιώνεται η

αλληλεπίδραση με τον χρήστη που τυπικά θα ζητά να δει δεδομένα ή να τα αλλάξει. Ό,τι κι αν ζητά ο χρήστης μέσω του πελάτη

υποβάλεται ως αίτημα στον εξυπηρετητή και, εφόσον είναι νόμιμο, διεκπεραιώνεται στον εξυπηρετητή και κάποιο αποτέλεσμα ή

ειδοποίηση επιστρέφει στον πελάτη.

Στο μοντέλο πελάτη/εξυπηρετητή ο πελάτης και ο εξυπηρετητής κρατάνε τα τσαννάκια τους χωριστά. Οι αλλαγές στη ΒΔ

γίνονται ολοκληρωτικά στον εξυπηρετητή. Αντίθετα, στο μοντέλο του εξυπηρετητή αρχείων που είδαμε στην προηγούμενη

ενότητα, όλη η δουλειά γίνεται στον πελάτη και μόνο η αποθήκευση του αρχείου γίνεται στον εξυπηρετητή.

Εικόνα 6 Κύρια φόρμα της εφαρμογής

Εικόνα 7 Υπηρεσίες στο παρασκήνιο

Εικόνα 8 Περιβάλλον πελάτη/εξυπηρετητή

Page 4: Σημειώσεις για βάσεις δεδομένων Client Server

IEK ΣΥΡΟΥ 2013 Γλώσσα Προγραμματισμού V Τεχνικός Εφαρμογών Πληροφορικής

Σελ. 4 27-Μαϊ-14 [email protected]

2. Οπτικός προγραμματισμός Τώρα θα κάνουμε μια μικρή παράκαμψη προς το βασικό στόχο του μαθήματος που είναι ο προγραμματισμός πελάτη-

εξυπηρετητή για να θυμηθούμε λίγο τον οπτικό προγραμματισμό, την πιο εύκολη και ευχάριστη μεθοδολογία προγραμματισμού

που συνδυάζει και προσπέλαση δεδομένων σε ΒΔ με το λιγότερο δυνατό γράψιμο κώδικα.

Θα χρησιμοποιήσουμε το περιβάλλον ανάπτυξης Visual Basic 2010 Express που μπορείτε να κατεβάσετε και εγκαταστήσετε δω-

ρεάν και νόμιμα από τη Microsoft.

2.1 Βασικές έννοιες του οπτικού προγραμματισμού

Σε αντίθεση με τον κλασικό 'προστακτικό' προγραμματισμό (imperative program-

ming), που αρκεί να κατανοήσεις μόνο την έννοια της μεταβλητής και αμέσως είσαι

έτοιμος να αρχίσεις να γράφεις προγράμματα (δες Πρόγραμμα 1), ο οπτικός προγραμ-

ματισμός (visual programming) απαιτεί την εισαγωγή των εννοιών του χειριστηρίου

(αντικειμένου), της ιδιότητας και του συμβάντος4.

Ένα χειριστήριο (component) είναι ένα συστατικό που κάνει μια δουλειά, πχ στο πα-

ρουσιαστικό της εφαρμογής. Ένα παράδειγμα χειριστηρίου είναι το πλαίσιο κειμένου το οποίο είναι ένα ορθογώνιο πλαίσιο στο

οποίο μπορούμε να γράψουμε κάποιο κείμενο. Κάθε χειριστήριο έχει μια εμφάνιση (πχ μέγεθος, χρώμα, γραμματοσειρά) και συ-

μπεριφορά (πχ, όταν κάνεις κλικ, να επανέρχεται το περιεχόμενο στην αρχική του τιμή). Στη Visual Basic τα διαθέσιμα χειριστή-

ρια είναι στο Toolbox (εργαλειοθήκη).

Για να αλλάξουμε την εξ ορισμού λειτουργία του χειριστηρίου πειράζουμε τις ιδιότητές του (properties). Κάθε χειριστήριο έχει

δεκάδες ιδιότητες – κάποιες εμφανίζονται σε διάφορα χειριστήρια και κάποιες είναι ιδιαίτερες στο καθένα. Οι τιμές των ιδιοτή-

των καθορίζουν την εμφάνιση του χειριστηρίου, πχ το πλάτος του ή το χρώμα του, αλλά και τη συμπεριφορά του, πχ αν είναι

ορατό ή ενεργό. Ας πω και δυο λόγια για το συντακτικό. Αν έχουμε ένα αντικείμενο Α, αναφέρομαι στην ιδιότητα Ι ως Α.Ι, δηλα-

δή πρώτα το όνομα του αντικειμένου, μετά μια τελίτσα και μετά το όνομα της ιδιότητας. Παράδειγμα: σε χειριστήριο φόρμας με

όνομα frmKyria, κάνω κίτρινο το φόντο με την εντολή frmKyria.BackColor = Color.Yellow

Τέλος χρειάζεται να μπορώ να εκτελώ τμήματα κώδικα σε ανταπόκριση στην πραγματοποίηση συγκεκριμένων συμβάντων

(events). Για παράδειγμα, όταν ο χρήστης αλλάζει κάποιο κείμενο ή όταν κάνει κλικ πάνω σε μια περιοχή, πυροδοτείται το αντί-

στοιχο συμβάν.

Αυτές είναι οι τρεις βασικές προαπαιτούμενες έννοιες που πρέπει να ξέρει κάποιος για να αναπτύξει σε VB: τα χειριστήρια (αντι-

κείμενα), οι ιδιότητες και τα συμβάντα.

2.2 Δυο κουβέντες για τη Visual Basic

Visual Basic (VB): Δεν υπάρχει πιο γρήγορος τρόπος για να φτιάξεις προγράμματα που έχουν γραφική διεπαφή χρήστη (Graph-

ical User Interface, GUI), τελεία και παύλα. Επίσης, το περιβάλλον ανάπτυξης Visual Basic 2010 Express είναι σχετικά απλό στη

χρήση και βοηθά τον προγραμματιστή με τον άμεσο συντακτικό έλεγχο και τη συμπλήρωση εντολών (command completion)

κατά την πληκτρολόγηση. Εδώ τελειώνουν τα προτερήματα.

Η γλώσσα, παρότι έχει απλό συντακτικό, είναι ένας αχταρμάς από την παλιά προστακτική Basic (γεννημένη τη δεκαετία του 60!,

δείτε Πρόγραμμα 1) και τις αντικειμενοστραφείς (object-oriented) γλώσσες που έγιναν της μόδας τη δεκαετία του 80 (Java,

C++). Επίσης, η VB είναι δεμένη με τη Microsoft και τα Windows, άρα τα προγράμματά της δεν τρέχουν σε Linux, ή σε κινητά

Android, ή iOS.

Τέλος, είναι αργή, όπως όλες

οι γλώσσες που δεν παράγουν

εκτελέσιμο κώδικα μηχανής,

αλλά ενδιάμεσο κώδικα που

τρέχει πάνω σε μια ιδεατή

μηχανή (virtual machine).

Είναι δηλαδή εξέλιξη αυτού

που παλιά θα λέγαμε διερμη-

νευόμενη (interpreted) γλώσ-

σα, σε αντιπαραβολή με μια

μεταγλωττιζόμενη (compiled)

γλώσσα.

Στις καλές της μέρες η VB τη

δεκαετία του 90 υπήρξε η πιο

δημοφιλής γλώσσα προγραμ-

ματισμού, αλλά τώρα έχει

πάρει την κατηφόρα. Κρίμα!

4 Είναι ενδιαφέρον ότι στον οπτικό / αντικειμενοστραφή προγραμματισμό η έννοια της μεταβλητής (=ονοματισμένη θέση μνή-

μης όπου μπορώ να αποθηκεύσω και να ανακαλέσω τιμές συγκεκριμένου τύπου δεδομένων) δεν είναι βασική – μάλιστα ίσως να

είναι και αποφευκτέα η χρήση της. Θα δείτε ότι μεταβλητές θα χρησιμοποιούνται μόνο ως προσωρινές θέσεις αποθήκευσης με

μικρή διάρκεια ζωής.

INPUT a, b

apotel = a+ b

PRINT a, b, apotel

Πρόγραμμα 1 Παραδοσιακή Basic

Πίνακας 1 Δημοφιλία γλωσσών προγραμματισμού (πηγή www.tiobe.com)

Page 5: Σημειώσεις για βάσεις δεδομένων Client Server

Τεχνικός Εφαρμογών Πληροφορικής Γλώσσα Προγραμματισμού V IEK ΣΥΡΟΥ 2013

[email protected] 27-Μαϊ-14 Σελ. 5

Χειριστήριο Ελληνικά Πρόθεμα

(Form) Φόρμα frm

Label Ετικέτα lbl

TextBox Πλαίσιο κειμένου txt

Button Κουμπί btn

ComboBox Σύνθετο πλαίσιο cbo

RadioButton Ραδιοκουμπί rdo

DateTimePicker Ημερολόγιο dtp

Πίνακας 2 Ονομασία κοινών χειριστηρίων

2.3 Χαιρετίσματα

Ας φτιάξουμε ένα πρόγραμμα που θα του δίνουμε το όνομά μας και θα μας χαιρετάει. Θα επιλέξουμε τη δημιουργία

ενός νέου έργου (project) τύπου Windows Forms Application και όνομα HelloProgram. Με το καλημέρα, το περι-

βάλλον δείχνει κάπως περίπλοκο, καθώς εμφανίζονται τα τέσσερα παράθυρα που θα δουλεύουμε:

Toolbox που περιέχει τα διαθέσιμα χειριστήρια

Design που δείχνει τη σχεδίαση της φόρμας του προγράμματος που φτιάχνουμε

Solution Explorer που απαριθμεί τα συστατικά του προγράμματος, πχ φόρμες, τμήματα κώδικα, και

Properties που εμφανίζει τις διαθέσιμες ιδιότητες για το τρέχον επιλεγμένο χειριστήριο / αντικείμενο

Ήδη το έργο περιλαμβάνει

μια (κενή) φόρμα που φρο-

ντίζω άμεσα να της αλλάξω

όνομα σε frmHello. Για να

το κάνω αυτό επιλέγω την

φόρμα από τον Solution Ex-

plorer και αλλάζω την ιδιό-

τητα FileName.

Οι προγραμματιστές είναι

πολύ μυστήριοι σε ότι αφο-

ρά την ονομασία μεταβλη-

τών, σταθερών κλπ., καθώς

θα έχετε καταλάβει μέχρι

τώρα. Παρότι δεν επιβάλλε-

ται, ακολουθούν συμβάσεις

(εμείς θα ακολουθήσουμε

την λεγόμενη Ουγγρική ο-

νοματολογία) στην ονομασία

που τις τηρούν ευλαβικά και

ισχυρίζονται ότι αυτό τους

κάνει τη ζωή πιο εύκολη

(αλλά μάλλον είναι απλή

παραξενιά τους). Έτσι όλες

τις φόρμες θα τις ονομάζου-

με με το πρόθεμα frm.

Αμέσως μετά επιλέγουμε τη

φόρμα στο Design και εμφανίζονται οι οπτικές ιδιότητες τις φόρμας και

θέτω την ιδιότητα Text σε 'Χαιρέτα με!', προσαρμόζω το μέγεθος της

όπως μου αρέσει και επειδή αυτή την εποχή αγόρασα νέες μπότες βάζω

τη φωτογραφία τους ως BackgroundImage με BackgroundImageLayout

= Zoom για να μην τις περικόπτει που δεν χωράνε στις διαστάσεις της

φόρμας. Παρατηρήστε ότι οι ιδιότητες που έχουν αλλάξει από τις εξ

ορισμού τιμές τους ξεχωρίζουν με χτυπητά (bold) γράμματα στο παρά-

θυρο Properties. Άμα έχετε καλλιτεχνικές ανησυχίες, τώρα είναι η κα-

τάλληλη στιγμή να τις εκδηλώσετε προσαρμόζοντας τη σχεδίαση του

οπτικού μέ-

ρους του

προγράμμα-

τος: αλλάξτε

διαστάσεις, χρώματα, γραμματοσειρές πειράζοντας τις ιδιότητες του

αντίστοιχου χειριστηρίου.

Ας θαυμάσουμε το (άχρηστο) αριστούργημά μας εκτελώντας το με το

πράσινο τριγωνάκι κάτω από τα μενού ή με το πλήκτρο F5 (Εικόνα

10). Όμορφη, ε; Διακόπτουμε την εκτέλεση με το μπλε τετράγωνο,

γιατί αλλιώς δεν θα μπορούμε να κάνουμε αλλαγές.

Τώρα προσθέτουμε ένα χειριστήριο τύπου Label πάνω στη φόρμα και

αφού του βάλουμε Name = lblOnoma και Text = 'Πώς σε λένε;' του

προσαρμόζουμε Font, ForeColor, BackColor και ό,τι άλλη ιδιότητα

στην ενότητα Appearance. Παρομοίως, προσθέτουμε χειριστήριο

TextBox θέτοντας Name = txtOnoma και ένα Button με Name =

btnHello.

Μόλις ολοκληρώσαμε τη σχεδίαση του οπτικού μέρους του προγράμ-

ματος (δεν θέλω σχόλια για την αισθητική των χρωμάτων). Δοκιμά-

ζουμε να το τρέξουμε για να δούμε αν έχει λάθη (πλάκα κάνω – δεν

Εικόνα 9 Το έργο στo περιβάλλον ανάπτυξης της VB

Εικόνα 10 Το πρώτο VB πρόγραμμα

Page 6: Σημειώσεις για βάσεις δεδομένων Client Server

IEK ΣΥΡΟΥ 2013 Γλώσσα Προγραμματισμού V Τεχνικός Εφαρμογών Πληροφορικής

Σελ. 6 27-Μαϊ-14 [email protected]

μπορεί να έχει λάθη). Δοκιμάζουμε γράφοντας και σβήνοντας στο πλαίσιο κειμένου και κλικάροντας το κουμπί. ΟΚ. Τώρα θα

γράψουμε επιτέλους κώδικα.

Κώδικας πίσω από τη φόρμα Στον οπτικό προγραμματισμό ο κώδικας δεν γράφεται χύμα σαν κατεβατό που ξεκινάει να εκτελείται από την πρώτη γραμμή μέ-

σα σε κάποια υπορουτίνα main. Στη VB τοποθετούμε τις εντολές του κώδικα σε «σκελετούς» που μας φτιάχνει το περιβάλλον

ανάπτυξης.

Για παράδειγμα, θέλουμε το πρόγραμμα να αντιδρά όταν ο χρήστης κάνει κλικ στο κουμπί. Κάνουμε διπλό κλικ πάνω στο κου-

μπί και εμφανίζεται ως δια μαγείας ένας ακατανόητος κώδικας, αυτός που βλέπετε πάνω σε καφέ φόντο στο Πρόγραμμα 2. Μην

ανησυχείτε, δεν

χρειάζεται να

σας τον εξηγήσω

– ούτε κι εγώ

εξάλλου ξέρω τι

ακριβώς σημαί-

νει. Σε γενικές

γραμμές είναι

ένας σκελετός

προγράμματος

για τη φόρμα frmHello (δες γραμμή 1) που περιλαμβάνει μια υπορουτίνα (δες γραμμή 2) που το περιεχόμενό της εκτελείται όταν

κλικάρεται το κουμπί. Η συνεισφορά μας θα είναι οι περισπούδαστες εντολές στις γραμμές 3-4 στο άσπρο φόντο. Από δω και

κάτω όποτε βλέπετε κώδικα σε σκουρόχρωμο φόντο, είναι σκελετός που τον φτιάχνει αυτόματα το περιβάλλον ανάπτυξης – δεν

χρειάζεται να τον πληκτρολογήσετε.

Γενικότερα, στον αντικειμενοστραφή προγραμματισμό οι ενότητες προγράμματος ονομάζονται κλάσεις. Στο εσωτερικό μιας

κλάσης μπορούμε να δηλώσουμε μεταβλητές και υπορουτίνες. Παρατηρήστε την οδόντωση που δείχνει ξεκάθαρα ότι η υπορου-

τίνα btn_Click ανήκει στην κλάση frmHello.

Μια κουβέντα ακόμη. Οι λέξεις Public και Private δηλώνουν την εμβέλεια. Για παράδειγμα η κλάση frmHello που έχει δημόσια

εμβέλεια (Public), είναι ορατή από παντού μέσα στην εφαρμογή. Αντίθετα, η μέθοδος btnHello_Click που έχει ιδιωτική εμβέλεια

είναι ορατή, δηλ. μπορεί να κληθεί, μόνο από το εσωτερικό της κλάσης frmHello, ενώ είναι αόρατη και μη προσπελάσιμη από τις

υπόλοιπες κλάσεις της εφαρμογής.

Το μόνο που θα εξηγήσω είναι ότι προσπελαύνουμε το περιεχόμενο του πλαισίου κειμένου με txtOnoma.Text. Έτσι αναφερόμα-

στε σε μια ιδιότητα ή ένα συμβάν ενός αντικειμένου, εεε χειριστηρίου θέλω να πω (είναι το ίδιο πράγμα, απλώς η λέξη αντικείμε-

νο παραπέμπει σε αυτό το ασυμπάθηστο πράγμα που σας έχει πρήξει στη C++, τον αντικειμενοστραφή προγραμματισμό5.

Επειδή όμως μαθαίνουμε προγραμματισμό, ας εξελίξουμε

το πρόγραμμα για να γίνει λίγο πιο έξυπνο. Θέλουμε να

μας χαιρετάει διαφορετικά, ανάλογα με την ώρα. Καθώς

είστε έξυπνα παιδιά δεν θα εξηγήσω τίποτα στο Πρό-

γραμμα 3, εκτός από το Now που είναι η συνάρτηση που

επιστρέφει την ημερομηνία και ώρα του υπολογιστή και

την ιδιότητα .Hour που απομονώνει την ώρα.

Με την εντολή Me.Close() κλείνει η φόρμα που είναι

ανοικτή – βάλτε την πίσω από ένα κουμπί btnTerma με

Text = 'Τερματισμός' για να κάνετε τους επαγγελματίες.

Εναλλακτικά, όποτε χρειαστεί να τερματίσετε δια ροπά-

λου το πρόγραμμά σας, η εντολή είναι Application.Exit().

Εδώ τελειώνει το παράδειγμα. Ο Πίνακας 3 ανακεφαλαιώνει την εμμο-

νή μου με την ονοματολογία των τύπων δεδομένων στη VB.

Σε αυτή την ενότητα πήραμε το βάπτισμα του πυρός με τη γλώσσα VB

και το περιβάλλον ανάπτυξης. Θα συνεχίσουμε με άλλο ένα παράδειγ-

μα, όπου θα γράψουμε περισσότερο κώδικα και θα δούμε πώς αντιμε-

τωπίζουμε τα σφάλματα κατά τον προγραμματισμό και ειδικότερα τη

βοήθεια που προσφέρει ένα περιβάλλον ανάπτυξης όπως το Visual

Studio.

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

γλώσσα (πχ Smalltalk ή άντε Java) ή τουλάχιστον με τα κατάλληλα εργαλεία (πχ BlueJ).

1 Public Class frmHello 2 Private Sub btnHello_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHello.Click

3 Beep() 4 MessageBox.Show("Γεια σου " & txtOnoma.Text) 5 End Sub 6 End Class

Πρόγραμμα 2 Σκελετός συμβάντος Click

Dim intOra As Integer, strXaire As String intOra = Now.Hour If intOra < 12 Then strXaire = "Καλημέρα" ElseIf intOra < 20 Then strXaire = "Καλησπέρα" Else strXaire = "Καληνύχτα" End If MessageBox.Show(strXaire & " " & txtOnoma.Text)

Πρόγραμμα 3 Χαιρετισμός με την ώρα

Τύπος δεδομένων Δήλωση Πρόθεμα

Ακέραιος Integer int

Πραγματικός Double dbl

Συμβολοσειρά String str

Ημερομηνία/Ώρα Date dtm

Χαρακτήρας Char chr

Αληθές/Ψευδές Boolean bln

Πίνακας 3 Τύποι δεδομένων στη VB

Page 7: Σημειώσεις για βάσεις δεδομένων Client Server

Τεχνικός Εφαρμογών Πληροφορικής Γλώσσα Προγραμματισμού V IEK ΣΥΡΟΥ 2013

[email protected] 27-Μαϊ-14 Σελ. 7

2.4 Αμοιβή με τη λέξη

Παλιότερα οι δημοσιογράφοι αμείβονταν για τα άρθρα τους με

τη λέξη. Δηλαδή τους όριζε ο αρχισυντάκτης ότι η στήλη τους

πρέπει να είναι περίπου 1000 λέξεις και εκείνοι έγραφαν μέχρι

να φτάσουν τόσες. Ίσως σας θυμίζει τις εποχές του σχολείου

που η έκθεση έπρεπε να είναι δυο σελίδες και κάναμε μεγάλα

γράμματα για να γεμίσουν. Θα φτιάξουμε λοιπόν ένα πρόγραμμα που θα

μετρά τις λέξεις του κειμένου και, αν το επιλέξουμε, τους χαρακτήρες του.

Κατά τα γνωστά, δημιουργούμε νέο project LexoMetro, με φόρμα frmLexo

και πάνω της:

Ετικέτα lblKeimeno με Caption = 'Εισάγετε κείμενο:'

Πλαίσιο κειμένου txtKeimeno με ιδιότητες MultiLine και ScrollBars =

Both

Δυο ραδιοφωνικά κουμπιά (RadioButtons) με ονόματα rdoLexeis και

rdoXaraktires, εκ των οποίων ας πούμε να είναι επιλεγμένο το πρώτο

με το ξεκίνημα του προγράμματος, άρα κάντε την ιδιότητα Checked =

True.

Άλλη μια ετικέτα lblMetritis, όπου θα εμφανίζεται το αποτέλεσμα της

μέτρησης με BorderStyle = FixedSingle.

Άμα το τρέξετε, πρέπει να δείχνει όπως η Εικόνα 11. Μπορείτε να εισάγετε κείμενο, αλλά φυσικά δεν μετράει τίποτα. Πάντως τα

ραδιοκουμπιά εναλλάσονται κανονικά. Τερματίζουμε την εκτέλεση για να συνεχίσουμε τις αλλαγές.

Με διπλό κλικ πάνω στο χειριστή-

ριο txtKeimeno, ανοίγει ο σκελε-

τός και, ω του θαύματος, είμαστε

στο συμβάν TextChanged του χει-

ριστηρίου txtKeimeno της φόρμας

frmLexo (εντοπίστε τα στο Πρό-

γραμμα 4). Είμαστε στο σωστό

σημείο για να εισάγουμε τον κώδι-

κα που θα εκτελείται όποτε αλλά-

ζει το περιεχόμενο του txt-

txtKeimeno. Γράφουμε τον κώδικα

των γραμμών 4-19.

Συνιστώ να γράφετε τις εντολές

μόνο με πεζά και ο καθοδηγούμε-

νος από το συντακτικό διορθωτής

(syntax-directed editor) θα τις ανα-

γνωρίζει και θα τις φτιάχνει όπως

πρέπει. Επίσης, επιβάλλεται να

γράφετε τον κώδικα με οδόντωση

(indentation) έτσι ώστε να είναι

ευδιάκριτα τα σώματα των περί-

κλειστων δομών ελέγχου, όπως οι

επαναλήψεις, επιλογές κ.λπ.

Το εξωτερικό If…Else…End If ελέγχει αν μετράμε λέξεις ή χαρακτήρες, ανάλογα με το ραδιοκουμπί που είναι επιλεγμένο (ιδιό-

τητα Checked). Ας ξεκινήσουμε με την μέτρηση των χαρακτήρων που είναι πιο εύκολη: στη γραμμή 18 υπολογίζουμε το μήκος

του κειμένου με τη συνάρτηση Len (δείτε Πίνακας 4) και το εμφανίζουμε στην ετικέτα lblMetritis που είναι πάνω στην φόρμα.

Ας εξηγήσω λίγο: txtKeimeno είναι το όνομα του χειριστηρίου που γράφουμε το κείμενο. Με .Text μας επιστρέφει την τιμή του

περιεχομένου του που είναι μια συμβολοσειρά, και η συνάρτηση Len εφαρμοσμένη πάνω σε μια συμβολοσειρά επιστρέφει το

μήκος της σε χαρακτήρες.

Στις γραμμές 5-16 το πρόγραμμα μετρά λέξεις. Ο κώδικας είναι πιο δυσνόητος, αλλά αυτό που κάνει είναι να διατρέχει το κείμε-

νο από τον πρώτο ως τον τελευταίο χαρακτήρα (επανάληψη στη γραμμή 6). Στη γραμμή 7 απομονώνει το χαρακτήρα στη θέση

intPos του κειμένου (δείτε τη λειτουργία της συνάρτησης Mid στον Πίνακας 4). Η μεταβλητή booInWord αλλάζει ανάλογα με το

1 Public Class frmLexo 2 Private Sub txtKeimeno_TextChanged(ByVal sender As System.Object, 3 ByVal e As System.EventArgs) Handles txtKeimeno.TextChanged 4 If rdoLexeis.Checked Then 'μετρά λέξεις 5 Dim blnInWord As Boolean, intLexeis As Integer 6 For intPos As Integer = 1 To Len(txtKeimeno.Text) 7 If Mid$(txtKeimeno.Text, intPos, 1) = " " Then 8 blnInWord = False 9 Else

10 If Not blnInWord Then 11 blnInWord = True 12 intLexeis += 1 'αύξησε το μετρητή 13 End If 14 End If 15 Next intPos 16 lblMetritis.Text = intLexeis 17 Else 'μετρά χαρακτήρες 18 lblMetritis.Text = Len(txtKeimeno.Text) 19 End If 20 End Sub 21 End Class

Πρόγραμμα 4 Μέτρηση λέξεων / χαρακτήρων (α' έκδοση απλοϊκή)

Len(s) Επιστρέφει το μήκος της συμβολοσειράς s s = 'abcd' Len(s) → 4

Left(s,n) Επιστρέφει συμβολοσειρά με τους n πρώτους χαρακτήρες της s Left(s, 2) → 'ab'

Right(s, n) Ομοίως τους τελευταίους Right(s, 2) → 'cd'

Mid(s, n,m) Επιστρέφει συμβολοσειρά με m χαρακτήρες από τη θέση n και μετά Mid(s, 2, 2) → 'bc'

Πίνακας 4 Συναρτήσεις συμβολοσειρών

Εικόνα 11 Τα χειριστήρια του λεξόμετρου

Page 8: Σημειώσεις για βάσεις δεδομένων Client Server

IEK ΣΥΡΟΥ 2013 Γλώσσα Προγραμματισμού V Τεχνικός Εφαρμογών Πληροφορικής

Σελ. 8 27-Μαϊ-14 [email protected]

αν είμαστε μέσα σε μια λέξη, ή σε κενά μεταξύ λέξεων. Αν ο χαρακτήρας που εξετάζεται είναι το κενό, το πρόγραμμα προχωρά-

ει στον επόμενο. Διαφορετικά, και εφόσον είναι ο πρώτος χαρακτήρας της λέξης, αυξάνει το μετρητή των λέξεων intLexeis.

Αυτός ο αλγόριθμος είναι μια καλή ευκαιρία να κάνουμε αποσφαλμάτωση (debugging) στη VB. Αν κλικάρετε στο αριστερό

περιθώριο μιας γραμμής του κώδικα, θα εμφανιστεί μια κόκκινη τελεία που υποδηλώνει σημείο διακοπής (breakpoint) και όλη η

γραμμή θα κοκκινίσει. Αν ξεκινήσετε το πρόγραμμα, η εκτέλεση θα διακοπεί ακριβώς σε εκείνη τη γραμμή, οπότε μπορείτε να

δείτε τις τιμές των μεταβλητών. Μετά μπορείτε να συνεχίσετε να τρέχετε το πρόγραμμα γραμμή-γραμμή με το πλήκτρο F8 και θα

κιτρινίζει η γραμμή που πρόκειται να εκτελεστεί επόμενη. Άμα βαρεθείτε να πηγαίνετε γραμμή-γραμμή, πατήστε F5 για να συνε-

χίσει κανονικά η εκτέλεση μέχρι το τέλος ή μέχρι το επόμενο σημείο διακοπής.

Ουφ, πολύ δουλειά. Ας το τρέξουμε να το χαρούμε. Πράγματι δουλεύει, αλλά όχι πάντα σωστά. Ας το εξελίξουμε λοιπόν. Μια

βελτίωση είναι να θεωρεί ως διαχωριστικό μεταξύ λέξεων όχι μόνο τον χαρακτήρα του κενού (' '), αλλά και τον στηλογνώμονα

(στη VB είναι η σταθερά vbTab) και την αλλαγή γραμμής, όταν πατάμε το πλήκτρο Enter στο πληκτρολόγιο (σταθερές vbCr,

vbLf). Αντικαθιστώ το If της γραμμής 7 στο Πρόγραμμα 4 με την εντολή Select Case στη γραμμή 19 στο Πρόγραμμα 5.

Μια ακόμα διόρθωση: όταν έχω γράψει ένα κείμενο και αλλάζω το τσεκαρισμένο ραδιοκουμπί, ο μετρητής δεν ενημερώνεται. Ε

βέβαια, αφού ο κώδικας που γράψαμε τρέχει μόνο όταν αλλάζει το κείμενο. Θέλουμε ο ίδιος κώδικας να τρέχει και όταν επιλέγε-

ται κάποιο από τα ραδιοκουμπιά. Μπορούμε να τον αντιγράψουμε και να τον επικολλήσουμε αυτούσιο μέσα στα αντίστοιχα συμ-

βάντα, αλλά αν το κάνετε έτσι ο δάσκαλος που σας έμαθε δομημένο προγραμματισμό θα τραβάει τα μαλλιά του.

Μέσα στα όρια της κλάσης frmLexo φτιάχνω μια υπορουτίνα, την Metra, και της βάζω τον κώδικα που έγραψα. Μετά τον σβήνω

από εκεί που ήταν και στη θέση του γράφω μια κλήση προς τη νέα υπορουτίνα που έφτιαξα. Τώρα βάζω αυτή η Metra να εκτε-

λείται και όταν αλλάζει η κατάσταση κάποιου

από τα ραδιοκουμπιά.

Φινίτο – δείτε το τελειωμένο Πρόγραμμα 5!

Φτιάξτε να αλλάζει το BackColor

του μετρητή σε πράσινο όταν

φτάνει τις 90 λέξεις και σε κόκκι-

νο όταν ξεπερνάει τις 100. (Δεν

κρατήθηκα, το ’φτιαξα και σας το δείχνω στο

Πρόγραμμα 6 για να δείτε μια παραλλαγή της

εντολής πολλαπλής επιλογής Select στη VB.

Βάλτε το ανάμεσα στις γραμμές 25 και 26.)

Άμα είσαστε μάλιστα τσίφτηδες, θα προσθέσε-

τε τη δυνατότητα να ορίζει ο τεμπελοδημοσιο-

γράφος το στόχο για το πλήθος των λέξεων για

το άρθρο του (σε ένα TextBox) και ο χρωματι-

σμός να γίνεται πράσινος όταν φτάνει στο 90%

του στόχου. Θα παίξετε με την ιδιότητα Back-

Color και τα χρώματα μπορείτε να τα βρείτε

γράφοντας Color. και θα σας προτείνει.

Άλλες επεκτάσεις:

1. Φτιάξτε δυνατότητα για να μετατρέ-

πεται κατ' επιλογή όλο το κείμενο σε πεζά, ή σε

κεφαλαία, ή (πιο δύσκολο) να γράφονται όλα με πεζά, εκτός από το αρχικό των λέξεων που ακολουθούν τελεία.

2. Φτιάξτε δυνατότητα που αφαιρεί πολλαπλά συνεχόμενα κενά και τα αντικαθιστά με ένα.

3. Ο δημοσιογράφος είναι πρεσβύωψ και δεν βλέπει τα μικρά γραμματάκια του κειμένου, παρά μόνο με μεγεθυντικό φακό. Να

μπορεί να επιλέγει μέγεθος γραμματοσειράς.

1 Public Class frmLexo 2 Private Sub txtKeimeno_TextChanged(ByVal sender … 3 Call Metra()'κλήση 4 End Sub 5 Private Sub rdoLexeis_CheckedChanged(ByVal sender … 6 Call Metra() 7 End Sub 8 Private Sub rdoXaraktires_CheckedChanged(ByVal … 9 Call Metra()

10 End Sub 11 Private Sub Metra() 'μετρά και ενημερώνει 12 If rdoLexeis.Checked Then 'μετρά λέξεις 13 Dim booInWord As Boolean, intLexeis As Integer 14 For intPos As Integer = 1 To Len(txtKeimeno.Text) 15 Select Case Mid$(txtKeimeno.Text, intPos, 1) 16 Case " ", vbTab, vbCr, vbLf 17 booInWord = False 18 Case Else 'όχι κενό 19 If Not booInWord Then 20 booInWord = True 21 intLexeis += 1 'αύξησε το μετρητή 22 End If 23 End Select 24 Next intPos 25 lblMetritis.Text = intLexeis 26 Else 'μετρά χαρακτήρες 27 lblMetritis.Text = Len(txtKeimeno.Text) 28 End If 29 End Sub 30 End Class

Πρόγραμμα 5 Μέτρηση λέξεων / χαρακτήρων

(β' έκδοση εξελιγμένη)

Select Case intLexeis Case 0 To 89 lblMetritis.BackColor = Color.White Case 90 To 100 lblMetritis.BackColor = Color.Green Case Else lblMetritis.BackColor = Color.Red End Select

Πρόγραμμα 6 Πολλαπλή επιλογή

Page 9: Σημειώσεις για βάσεις δεδομένων Client Server

Τεχνικός Εφαρμογών Πληροφορικής Γλώσσα Προγραμματισμού V IEK ΣΥΡΟΥ 2013

[email protected] 27-Μαϊ-14 Σελ. 9

3. Δεδομένα από την Access Το προηγούμενο κεφάλαιο είχε στόχο να έχετε μια πρώτη επαφή με τη VB, αλλά δεν έχει καμιά σχέση με το κύριο αντικείμενο

του μαθήματος που είναι ο προγραμματισμός πελάτη - εξυπηρετητή. Μια πρώτη βουτιά στο αντικείμενο αυτό θα κάνουμε τώρα,

έχοντας ως εξυπηρετητή δεδομένων μια ΒΔ της Access και ως πελάτη ένα πρόγραμμα της VB. Ο στόχος είναι να ανασύρουμε τα

δεδομένα από τους πίνακες της ΒΔ

και να τα προβάλουμε σε ένα πλέγμα.

Αν φλομώσατε με τον κώδικα προη-

γουμένως, χαλαρώστε: γι' αυτή την

ενότητα δεν θα χρειαστεί να γράψετε

ούτε μια γραμμή κώδικα.

Θα χρησιμοποιήσουμε τη ΒΔ που

φτιάξαμε στην ενότητα 1.2 και περι-

λαμβάνει δυο πίνακες με τους πελά-

τες μιας επιχείρησης και τις πωλήσεις

προς αυτούς. Βρείτε το αρχείο POL-

DAT.MDB και θυμηθείτε τα περιε-

χόμενά του ανοίγοντάς το με την MS

Access (δείτε Εικόνα 12).

3.1 Δεδομένα σε πλέγμα

Ξεκινάμε στο Visual

Studio ένα New Project

που ονομάζουμε Poliseis.

Στην κενή φόρμα που

φτιάχνει μόνος του για κάθε νέο pro-

ject, αλλάζουμε το όνομα από Form1

σε frmPelates και μετά την ιδιότητα Text = Πελάτες.

Ανατρέχουμε στο Toolbox και στην ομάδα Data επιλέγουμε το χειριστήριο DataGridView. Όπως λέει και το όνομά του αυτό εί-

ναι ένα πλέγμα κελιών, όπως του Excel, που γεμίζουν με τιμές από τις εγγραφές ενός πίνακα.

Τώρα πρέπει να καθορίσουμε την πηγή από όπου θα αντλεί τα δεδομένα του το DataGridView1. Αυτό γίνεται προφανώς από το

Choose Data Source. Κάνουμε Add Project Data Source, μετά Database, μετά DataSet, μετά New Connection. Αλλάζουμε το Da-

ta Source σε Microsoft Access Database File και μετά Browse για να βρούμε το αρχείο POL-DAT.MDB που περιέχει τη ΒΔ, ό-

που το έχουμε στο σκληρό δίσκο του υπολογιστή μας ή στο δίκτυο. Άμα το εντοπίσουμε κάνουμε καλού-κακού ένα Test Connec-

tion, και ΟΚ.

Συνεχίζουμε Next και αποδεχόμαστε όταν μας προτείνει να αντιγράψει τη ΒΔ μέσα στο χώρο του VB project. Ξανά Next για να

αποδεχθούμε το όνομα του DataSet που φτιάχνει (θα δούμε αργότερα τι είναι αυτό). Στο Choose Your Database Objects επιλέ-

γουμε και τους δύο πίνακες και Finish. Μόλις ολοκληρώσαμε τη σύνδεση του VB προγράμματός μας με τη ΒΔ της Access.

Ξανανοίγουμε το μικρό βελάκι του Data-

GridView1 και επιλέγουμε ως Data

Source το TblPelates που περιέχει τους

πελάτες της επιχείρησης. Επίσης απο-

επιλέγουμε τα Enable Adding, Editing και

Deleting για να προσαρμόσουμε τη συ-

μπεριφορά του για ανάγνωση δεδομένων

μόνον (δείτε Εικόνα 13). Επιλέγουμε το

Enable Column Reordering για να επιτρέ-

πεται να αλλάξουμε τη σειρά των πεδίων

στο πλέγμα. Ας κάνουμε και κάτι διακο-

σμητικό, επιλέγοντας Dock In Parent

Container που 'ξεχειλώνει' το πλέγμα ώ-

στε να καλύπτει όλο το χώρο της φόρμας.

Έτσι, αλλάζοντας το μέγεθος της φόρμας,

θα προσαρμόζεται και το DataGridView1.

Τρέχουμε και voilà μια φόρμα της VB με τους πε-

λάτες από τη ΒΔ. Μπορείς να μετακινηθείς πάνω-

κάτω στις εγγραφές και δεξιά-αριστερά στα πεδία.

Επίσης, μπορείς να σύρεις τις επικεφαλίδες των

πεδίων για να τους αλλάξεις σειρά. Τέλος μπορείς

να ταξινομήσεις τις εγγραφές κάνοντας κλικ πάνω

στο όνομα του αντίστοιχου πεδίου. Παρατηρήστε

πόσο μοιάζει η Εικόνα 14 του πλέγματος της VB με

Εικόνα 12 Οι πίνακες της ΒΔ POL-DAT.MDB

Εικόνα 13 Ρυθμίσεις του χειριστηρίου DataGridView

Εικόνα 14 Οι πελάτες στο πλέγμα

Page 10: Σημειώσεις για βάσεις δεδομένων Client Server

IEK ΣΥΡΟΥ 2013 Γλώσσα Προγραμματισμού V Τεχνικός Εφαρμογών Πληροφορικής

Σελ. 10 27-Μαϊ-14 [email protected]

την Εικόνα 12 της Access.

Για εξάσκηση, φτιάξτε μια νέα φόρμα frmPoliseis από το μενού Project, Add

Windows Form και επαναλάβετε τη διαδικασία για τις πωλήσεις.

Ολοκληρώνοντας την ενότητα, φτιάξτε μια τρίτη φόρμα frmKyria, προσθέστε

ένα κουμπί

btnPelates που

όταν το κλικά-

ρεις θα εκτελεί

την εντολή

frmPelates.Show

που ανοίγει την

φόρμα των πε-

λατών. Άντε κι άλλο ένα κουμπί για τις πωλήσεις (Εικόνα 15).

Τώρα το μόνο που μένει είναι να πείτε στο πρόγραμμα να ξεκινά την

εκτέλεση με τη φόρμα frmKyria. Αυτό γίνεται από το μενού Project,

Poliseis Properties, στο Startup form θέσατε frmKyria (Εικόνα 16).

Το παρασκήνιο Κράτησα την υπόσχεσή μου για ένα πλήρες, λειτουργικό παράδειγ-

μα προγράμματος πελάτη χωρίς να γράψετε καθόλου κώδικα. Ξε-

κούραστη δουλειά, εντυπωσιακό αποτέλεσμα, αλλά τώρα ας ερευνήσουμε τι συνέβη κάτω από το χαλί και ο μάγος (wizard) έ-

φτιαξε αυτό το τελικό προϊόν. Στην πραγματικότητα, ο μάγος έγραψε κώδικα πίσω από την κουρτίνα ακολουθώντας τις αποκρί-

σεις που του δίναμε στην προηγούμενη διαδικασία.

Αν παρατηρήσετε κάτω από τη

φόρμα έχουν εμφανιστεί τρία ά-

γνωστου προελεύσεως αντικείμε-

να (Εικόνα 17). Ας δούμε ένα-ένα

τι είναι αυτά.

Τα δεδομένα που ανακαλούνται

από τον πίνακα της ΒΔ τοποθε-

τούνται σε μια δομή δεδομένων

στην κύρια μνήμη του υπολογι-

στή. Αυτό ονομάζεται DataSet (ας

το μεταφράσω σύνολο δεδομέ-

νων) και, εκτός από τα ίδια τα

δεδομένα, διατηρεί τα ονόματα

των πεδίων και τον τύπο δεδομέ-

νων τους. Το DataSet μπορεί να

περιλαμβάνει έναν ή περισσότε-

ρους πίνακες δεδομένων, καθώς

και τις σχέσεις τους. Τονίζω ότι

δεν είναι υποχρεωτικό τα δεδομέ-

να ενός DataSet να αντιστοιχούν

σε πίνακες της ΒΔ, αλλά μπορεί

να είναι "υπολογιζόμενα" από την

εκτέλεση ενός ερωτήματος SE-

LECT της SQL ή μιας όψης

(view)6.

Ο TableAdapter (= προσαρμογέας πίνακα) περιγράφει τα δεδομένα πίνακα που θα τροφοδοτήσουν το DataGridView. Στην α-

πλούστερη περίπτωση μπορεί να είναι ένας πίνακας από το DataSet, όπως ακριβώς στα παραδείγματα που προηγήθηκαν.

Τέλος, το BindingSource (=πηγή σύνδεσης) είναι ο ενδιάμεσος ανάμεσα στην DataSet και στο DataGridView.

Ανακεφαλαιώνοντας, αν έχετε ένα χειριστήριο που πρέπει να τροφοδοτηθεί με δεδομένα, όπως το DataGridView που είδαμε,

αυτό θα αντλεί τα δεδομένα από ένα BindingSource, που με τη σειρά του θα βασίζεται σε έναν πίνακα ή ερώτημα TableAdapter

που είναι τμήμα ενός DataSet.

Είδαμε ότι τα δεδομένα του πίνακα της ΒΔ αντιγράφονται στη μνήμη για να "γεμίσει" η φόρμα και έπειτα η σύνδεση του πελάτη

με τη ΒΔ διακόπτεται. Ξανανοίγει μόνο όταν χρειάζεται να ενημερωθεί η ΒΔ με τις αλλαγές που ζητά ο χρήστης από τον πελάτη.

Αυτό ονομάζεται αποσυνδεδεμένη αρχιτεκτονική (disconnected architecture). Έτσι ο εξυπηρετητής της ΒΔ μπορεί να δεχθεί

εκατοντάδες ή χιλιάδες πελάτες, διότι η σύνδεσή τους διαρκεί μόνον όσο είναι απαραίτητο.

Αν σας φαίνονται όλα αυτά περίπλοκα και ακαταλαβίστικα, έχετε δίκιο. Ας ασχοληθούμε λοιπόν με κάτι πιο ανάλαφρο.

6 Θυμηθείτε CREATE VIEW onomateponyma AS SELECT eponymo, onoma FROM pelates WHERE topos = 'ΣΥΡΟΣ'.

Εικόνα 15 Κύρια φόρμα των πωλήσεων

Εικόνα 16 Ορισμός της φόρμας εκκίνησης

Εικόνα 17 Μη οπτικά χειριστήρια εμφανίζονται κάτω από τη φόρμα

Page 11: Σημειώσεις για βάσεις δεδομένων Client Server

Τεχνικός Εφαρμογών Πληροφορικής Γλώσσα Προγραμματισμού V IEK ΣΥΡΟΥ 2013

[email protected] 27-Μαϊ-14 Σελ. 11

Προσαρμογή του πλέγματος Θα παίξουμε με τις ιδιότητες του πλέγματος για να το ομορφύνουμε λίγο. Δεν είναι τίποτα κρίσιμο, αλλά θα μας αφήσει χρόνο να

χωνέψουμε τις έννοιες που είδαμε στην προηγούμενη παράγραφο και ακούγονται σαν βαριά θεωρία.

Επιλέγοντας το DataGridView μπορούμε να παίξουμε με τις ιδιότητες στην ενότητα Appearance για να ρυθμίσουμε περίγραμμα

(BorderStyle), χρώμα πλέγματος (GridColor), αν είναι ορατός ο επιλογέας γραμμής (RowHeaderVisible) και διάφορες άλλες δια-

κοσμητικές λεπτομέρειες. Οι ιδιότητες ColumnHeadersΚάτι και RowHeadersΚάτι αφορούν τις κεφαλίδες στηλών και γραμμών

αντίστοιχα. Η σημαντικότερη ιδιότητα είναι η DefaultCellStyle που ανοίγοντας αποκαλύπτει διάφορες ρυθμίσεις εμφάνισης που

αφορούν τα όλα τα κελιά του πλέγματος. Αλλά μπορούμε να διαφοροποιήσουμε την εμφάνιση για κάθε στήλη ξεχωριστά.

Αυτό γίνεται πατώντας στο μαύρο τριγωνάκι του χειριστηρίου DataGridView που ανοίγει το αναδυόμενο παράθυρο Data-

GridView Tasks όπου επιλέγουμε Edit Columns. Εκεί βρίσκουμε τα πεδία που συμμετέχουν στο πλέγμα. Σε κάθε στήλη μπορού-

με

να αλλάξουμε την επικεφαλίδα με την ιδιότητα HeaderText,

να ορίσουμε το πλάτος της στήλης με την ιδιότητα AutoSizeMode,

να την αποκρύψουμε/εμφανίσουμε με την ιδιότητα Visible, και

να προσαρμόσουμε την εμφάνιση (χρώμα, γραμματοσειρά, στοίχιση, κλπ) από την ιδιότητα DefaultCellStyle.

Όρεξη να 'χεις και μπορείς να διαμορφώσεις το

DataGridView όπως γουστάρεις (η διαστροφή μπορεί να

φτάσει ως την Εικόνα 18). Παρόλα αυτά μας έμεινε ένα

απωθημένο: μπορείς να δεις (όμορφα) τα δεδομένα της

ΒΔ, αλλά όχι να τα αλλάξεις.

3.2 Μια εγγραφή στη φόρμα

Αν σας άρεσε το πλέγμα, ΟΚ. Αλλά αν θέλετε να βλέπετε

μια εγγραφή στην οθόνη και να έχετε πλήρη έλεγχο πού

και πώς θα εμφανίζεται κάθε πεδίο, δώστε βάση στην πε-

νιά. Τώρα θα φτιάξουμε άλλη μια φόρμα για τον πίνακα

των πελατών που θα τους εμφανίζει έναν-έναν και θα μπορείς να πλοηγείσαι στις εγγραφές.

Ξεκινάμε μια νέα φόρμα frmEnasPelatis και πάνω της τοποθετούμε μια ετικέτα με Text = 'Κωδικός'. Κανονικά θα

έπρεπε να την ονομάσουμε lblKodikos, αλλά μας έπιασαν οι τεμπελιές μας· εξάλλου, όταν δεν χρειάζεται να ανα-

φερθούμε με κώδικα σε ένα χειριστήριο, δεν υπάρχει επιτακτικός λόγος να το ονοματίσουμε.

Δίπλα στην ετικέτα βάζουμε ένα πλαίσιο κειμένου με όνομα txtPelKodik. Εδώ είναι το ενδιαφέρον σημείο: θέλουμε

να συνδέσουμε αυτό το πλαίσιο κειμένου με το πεδίο PelKodik του πίνακα tblPelates (δείτε Εικόνα 4) για να αντλεί από κει τιμές.

Επιλέγουμε το πλαίσιο κειμένου txtPelKodik και πηγαίνουμε στην ομάδα ιδιοτήτων (DataBindings) όπου ανοίγουμε την υπο-

ιδιότητα Text (καμιά σχέση με την ιδιότητα Text). Επιλέγουμε Other Data Sources, Project Data Sources, poliseisDataSet, tbl-

Pelates, PelKodik. Αυτό ήταν.

Τώρα δημιουργούμε άλλα τρία αντίγραφα από την ετικέτα και το πλαίσιο κειμένου και τα απλώνουμε πάνω στη φόρμα. Αλλά-

ζουμε το κείμενο στις ετικέτες και προσαρμόζουμε το πεδίο του πίνακα από το

οποίο αντλούν τιμές τα πλαίσια κειμένου (PelOnom, PelPhone, PelAnigma). Προ-

σθέτουμε και ένα CheckBox για ποικιλία και το συνδέουμε με το πεδίο PelNtopios

θέτοντας το DataBindings.Checked. Για διακοσμητικούς λόγους κάνουμε Check-

Align = MiddleRight, Text = Ντόπος: και αν είστε ανυπόμονοι, το τρέχετε. Θα

προβάλει τα στοιχεία του πρώτου πελάτη, αλλά πώς θα μετακινηθούμε και στους

υπόλοιπους;

Ψάξτε στην ενότητα Data της εργαλειοθήκης, εντοπίστε το χειριστήριο Binding-

Navigator (= πλοηγός σύνδεσης) και τοποθετήστε πάνω στη φόρμα. Θέσατε την

ιδιότητα BindingSource σε TblPelatesBindingSource για να του πείτε σε ποιο πί-

νακα να πλοηγείται.Αν έχετε πάθει εξάρτηση με την Access, όπως εγώ, αλλάξτε το

Dock σε Bottom. Αφού η φόρμα είναι για ανάγνωση δεδομένων και δεν μπορεί να

τροποποιήσει τα περιεχόμενα του πίνακα, λογικά δεν θέλετε τα πλήκτρα προσθή-

κης εγγραφής, διαγραφής, συνεπώς πηγαίνετε πάνω στη φόρμα και σβήστε τα.

Τώρα μπορείτε να παίξετε με την εμφάνιση, αλλάζοντας το μέγεθος και την όψη

των χειριστηρίων. Μπορεί να θέλετε να κάνετε στα πλαίσια κειμένου ReadOnly =

True, να ορίσετε τη στοίχιση του κειμένου με την ιδιότητα TextAlign, κλπ.

Εδώ ολοκληρώνεται η πρώτη μας επαφή με τον προγραμματισμό βάσεων δεδομένων μέσω VB. Για την ακρίβεια δεν γράψαμε

καθόλου κώδικα, αλλά καταφέραμε να συνδέσουμε δεδομένα της Access και να τα χρησιμοποιήσουμε ως πηγή δεδομένων για να

τα 'καταναλώσουμε' μέσα από το πρόγραμμα της VB.

Εικόνα 18 Το προσαρμοσμένο πλέγμα στη VB

Εικόνα 19 Μια εγγραφή

Page 12: Σημειώσεις για βάσεις δεδομένων Client Server

IEK ΣΥΡΟΥ 2013 Γλώσσα Προγραμματισμού V Τεχνικός Εφαρμογών Πληροφορικής

Σελ. 12 27-Μαϊ-14 [email protected]

4. Δεδομένα από τον SQL Server Στα προηγούμενα καταφέραμε να συνδεθούμε σε μια ΒΔ της Access που διατηρούσε τα δεδομένα και να τα δούμε μέσα από μια

εφαρμογή της VB. Μάλιστα, δοκιμάσαμε δυο παραλλαγές: στη μια προβάλλονταν όλες οι εγγραφές ταυτόχρονα στη φόρμα με τη

μορφή ενός πλέγματος που οι στήλες του ήταν τα πεδία και στην άλλη η φόρμα εμφάνιζε τα στοιχεία μιας μόνον εγγραφής από

τον πίνακα και είχε τη δυνατότητα πλοήγησης στις προηγούμενες / επόμενες εγγραφές7.

Τώρα θα προχωρήσουμε ένα βήμα παραπέρα: θα δημιουργήσουμε μια ΒΔ του SQL Server μέσα από το Visual Studio με τους

πίνακες, τις σχέσεις και λίγα δεδομένα για δείγμα. Μετά θα φτιάξουμε διάφορες φόρμες που θα προβάλλουν και θα ενημερώνουν

τους σχετικούς πίνακες. Χώρια που οι φόρμες μας θα είναι πιο εξελιγμένες, θα έχουμε φτάσει κοντύτερα στον προγραμματισμό

πελάτη-εξυπηρετητή.

Πριν να ξεκινήσουμε, να ελέγξετε ότι η υπηρεσία SQL Server (SQLEXPRESS) έχει ξεκινήσει. Θυμίζω ότι ο SQL Server, όπως

και όλα τα άλλα 'σοβαρά' Συστήματα Διαχείρισης Βάσεων Δεδομένων (πχ Oracle, MySQL), εκτελείται ως υπηρεσία από το λει-

τουργικό σύστημα. Δηλαδή τρέχει στο παρασκήνιο και μπορεί να είναι αόρατη η εκτέλεσή τους – αν εξαιρέσουμε ότι κάνουν το

μηχάνημα πιο αργό αφού καταναλώνουν μνήμη και κύκλους της CPU. Για να δείτε αν τρέχει ο SQL Server, πληκτρολογήστε

services.msc από μια γραμμή διαταγών και στο παράθυρο 'Υπηρεσίες' που θα ανοίξει, ψάξτε για SQL Server (SQLEXPRESS).

Αν δείτε κενή την κατάσταση, επιλέξτε Εκκίνηση8 και μετά από μερικά δευτερόλεπτα θα δείτε την Εικόνα 7, που επιβεβαιώνει

ότι ο εξυπηρετητής εκκίνησε και μπορεί να εξυπηρετεί πελάτες.

Η διαδικασία που θα ακολουθήσουμε έχει τρία βήματα:

1. Δήλωση της ΒΔ του SQL Server στο έργο της VB και σχεδίαση της ΒΔ

2. Δημιουργία του DataSet της VB που θα αντλεί τα δεδομένα από τη ΒΔ

3. Δημιουργία της φόρμας που θα εμφανίζει τα δεδομένα από το DataSet

Σχεδίαση της ΒΔ Επανερχόμενοι στο Visual Studio ανοίγουμε νέο έργο που το ονομάζουμε Sailing, αφού το παράδειγμα θα περιστρέ-

φεται γύρω από τα σκάφη ενός ιστιοπλοϊκού ομίλου. Από τον Solution Explorer δεξί-κλικάρουμε πάνω στο όνομα

του έργου και επιλέγουμε Add / New Item / Service-based Database για να φτιάξουμε μια νέα ΒΔ στον SQL Server.

Συμπληρώνουμε το όνομα της ΒΔ, έστω SailingDB.mdf. Στην προτροπή του μάγου 'Choose a Database Model' πα-

τάμε άκυρο, γιατί δεν έχει νόημα να συνδέσουμε τη ΒΔ αφού ακόμα είναι κενή. Στο έργο πλέον συμμετέχει και η

κενή ΒΔ SailingDB.mdf. Η κατάληξη .mdf είναι για αρχεία ΒΔ του SQL Server.

Για να φτιάξουμε πίνακες

στη ΒΔ θα χρησιμοποιήσου-

με το εξυπηρετικό εργαλείο

που μας προσφέρεται από το

περιβάλλον του Visual Stu-

dio9. Κάντε διπλό κλικ πάνω

στο SailingDB και θα ανοίξει

ένα νεο-εμφανιζόμενο παρά-

θυρο, ο Database Explorer.

Όπως λέει και το όνομά του,

σας δείχνει τα περιεχόμενα

της ΒΔ, από τα οποία μας

ενδιαφέρει η ενότητα Tables,

όπου με δεξί κλικ και Add New Table δημιουργούμε τους δυο πίνακες που φαίνονται στην Εικόνα 20. Η διαδικασία θυμίζει της

Access, αλλά μην ξεχνάτε ότι φτιάχνετε τη ΒΔ στον SQL Server.

Για να μην ξεχνιόμαστε κιόλας, προτείνω ως άσκηση να γράψετε τις εντολές CREATE TABLE της SQL που κάνουν

την ίδια δουλειά. Υπάρχει ένα μικρό μυστικό, αλλά διαβάστε το αφού τις γράψετε.

Όταν φτιάχνετε έναν πίνακα βάζοντας τα πεδία του στο πλέγμα, προτού κλείσετε το παράθυρο διαλέξτε από το μενού

Table Designer την επιλογή Generate Change Script. Αυτό θα σας δείξει τον SQL κώδικα που προκύπτει από τις ενέργειές σας

στο πλέγμα. Τελικά δηλαδή το περιβάλλον ανάπτυξης, ακολουθώντας τις οδηγίες σας, γράφει τον SQL κώδικα. Όταν κλείνετε το

παράθυρο της σχεδίασης του πίνακα, το περιβάλλον της VB στέλνει στον database server τις SQL εντολές προς εκτέλεση και τότε

εφαρμόζονται οι αλλαγές που βλέπετε στην οθόνη σας πάνω στην πραγματική ΒΔ. Έτσι, όταν κανένας περίεργος δάσκαλος, ή

ακόμα χειρότερα εργοδότης, σας ζητήσει να γράψετε κώδικα SQL που να φτιάχνει / τροποποιεί πίνακες, κ.λπ., ξέρετε το κόλπο

για να του τον δείξετε, χωρίς να θυμόσαστε ούτε μια διαταγή SQL.

7 Για να πω την αλήθεια, αυτό το απλούστατο αποτέλεσμα χρειάστηκε αρκετή προσπάθεια. Συγκρίνετε πόσο ευκολότερα θα το

καταφέρναμε αν φτιάχναμε τις φόρμες μέσα στην Access. Τότε γιατί παιδευόμαστε; Υπενθυμίζω ότι λύσεις Access δεν αντιμετω-

πίζουν προβλήματα μεγάλης κλίμακας και, αλίμονο, οι μεγάλοι παίκτες στη διαχείριση δεδομένων είναι αρκετά πίσω στην τεχνο-

λογία ταχείας ανάπτυξης εφαρμογών (Rapid Application Development). 8 Μια και είσαστε στις υπηρεσίες, με δεξί κλικ ανοίξτε τις ιδιότητες του SQL Server και ρυθμίστε τον τύπο εκκίνησης σε μη αυ-

τόματο. Έτσι γλιτώνετε να ξεκινά ο SQL Server κάθε φορά που ανοίγετε τον υπολογιστή. 9 Έχουμε κι άλλη επιλογή: να χρησιμοποιήσουμε το SQL Server Management Studio, όπως κάναμε στο μάθημα Βάσεις Δεδομέ-

νων ΙΙΙ. Αλλά πιστέψτε με, το περιβάλλον της VB κάνει καλύτερα τη δουλειά.

Εικόνα 20 Σχήμα της SailingDB

Page 13: Σημειώσεις για βάσεις δεδομένων Client Server

Τεχνικός Εφαρμογών Πληροφορικής Γλώσσα Προγραμματισμού V IEK ΣΥΡΟΥ 2013

[email protected] 27-Μαϊ-14 Σελ. 13

Αν τελειώσατε με τους πίνακες, πριν να αρχίσουμε να εισάγουμε δεδομένα, πρέπει να φτιάξουμε τη σχέση τους, δηλαδή τη γραμ-

μή που βλέπετε να τους ενώνει στην Εικόνα 20. Από την ενότητα Database Diagrams φτιάχνουμε ένα διάγραμμα που εμφανίζει

τους πίνακες και σέρνοντας το πεδίο TyposID του πίνακα TyposSkafous στο πεδίο SkafosTypos του πίνακα Skafi δημιουργούμε

μια σχέση ένα-προς-πολλά. Να έχετε στο μυαλό ότι κατά τη δημιουργία μιας σχέσης ξεκινάμε πάντα από ένα πεδίο που είναι

πρωτεύον κλειδί και πηγαίνουμε προς το αντίστοιχο πεδίο του δεύτερου πίνακα.

Για να θυμηθούμε λίγο ακόμα τα παλιά, για τον πίνακα TyposSkafous επιλέξτε από το Table Designer το Check Constraints. Εκεί

ορίστε ότι οι επιβάτες πρέπει να είναι θετικός αριθμός και το όνομα μοναδικό (UNIQUE). Επίσης, για τον πίνακα Skafi στο πεδίο

SkafosTypos που είναι ξένο κλειδί, φτιάξτε ευρετήριο10

(από την επιλογή Indexes/Keys).

Και έτσι κάναμε μια μικρή επανάληψη στη σχεδίαση ΒΔ φτιάχνοντας πίνακες, ορίζοντας πεδία και κλειδιά, δηλώνοντας σχέσεις,

κανόνες επικύρωσης και ευρετήρια.

Ακολούθως για εξάσκηση, επεκτείνετε τη ΒΔ για να διατηρεί

ποιος ιστιοπλόος ήταν πλήρωμα σε ποιο σκάφος. Υπόδειξη:

είναι μια σχέση πολλά-προς-πολλά ανάμεσα στους πίνακες

Skafi και Istioplooi. Γιατί;

Ολοκληρώνουμε το βήμα 1, εισάγοντας μερικά δείγματα δε-

δομένων με Show Table Data για να δοκιμάσουμε ότι η σχεδί-

αση των πινάκων και της σχέσης είναι εντάξει (Εικόνα 21).

Τώρα ξαναγυρίζουμε στη φόρμα που έχει φτιάξει το έργο και

την ονομάζουμε frmTyposSkafous. Από το μενού Data, επιλέ-

γουμε Add New Data Source, Database, Dataset και αποδεχό-

μαστε να φτιάξει σύνδεση με τη SailingDB.mdf. Προχωράμε

και επιλέγουμε να συμμετέχουν και οι δυο πίνακες στο Da-

taSet.

Δημιουργία DataSet Στο παράθυρο Data

Sources (Εικόνα 22)

μας δείχνει το Sail-

ingDBDataSet που

μόλις φτιάξαμε. Υπενθυμίζω ότι το DataSet είναι η αναπαράσταση στη μνήμη του υπο-

λογιστή των αντικειμένων της ΒΔ που τηρεί στη μονάδα αποθήκευσης (σκληρός δίσκος)

το ΣΔΒΔ.

4.1 Φόρμα πλέγματος

Είμαστε πανέτοιμοι να κάνουμε το βήμα 3, να γεμίσουμε τη φόρμα με τα χειριστήρια

που προβάλλουν τις εγγραφές του πίνακα TyposSkafous. Θέλουμε η φόρμα να έχει τη

μορφή πλέγματος, γι' αυτό ανοίγουμε την κενή φόρμα για σχεδίαση και πηγαίνουμε στο

παράθυρο Data Sources όπου στην ενότητα TyposSkafous ανοίγουμε το βελάκι και επι-

βεβαιώνουμε DataGridView. Έπειτα σέρνουμε το TyposSkafous πάνω στη φόρμα και

αυτόματα φτιάχνονται τα απαραίτητα χειριστήρια. Στο πλέγμα επιλέγουμε Dock in Par-

ent Container και στο BindingNavigator βάζουμε στην ιδιότητα Dock = Bottom. Φτιά-

χνουμε και το Name της φόρμας, ενώ παίζουμε λίγο και στο Edit Columns του πλέγμα-

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

Έτοιμη η φόρμα (Εικόνα 23)! Όχι μόνο προβάλει τα περιεχόμενα του πίνακα, αλλά μπο-

ρεί να εισάγει νέες εγγραφές, να διαγράφει και να ενημερώνει τις υπάρχουσες. Πειραμα-

τιστείτε για να δείτε πώς συμπεριφέρεται:

Ενημέρωση Τροποποιείτε μια εγγραφή και πατάτε το εικονίδιο της δισκέτας.

Προσθήκη Πατάτε το εικονίδιο +, προσθέτετε την εγγραφή.

Διαγραφή Δοκιμάστε να σβήσετε το Optimist :-( Γιατί;

Έχουμε μια πλήρως λειτουργική φόρμα πλέγματος της VB για έναν πί-

νακα που ανήκει σε ΒΔ του SQL Server.

4.2 Αναλυτική φόρμα με πεδία αναζήτησης

Ας φτιάξουμε τώρα μια αναλυτική φόρμα για τα σκάφη.

Επιλέγουμε Project, κάνουμε Add Windows Form και την

ονομάζουμε frmSkafi. Αυτή τη φορά θα επιλέξουμε από το

παράθυρο Data Sources τον πίνακα Skafi και προτιμούμε

Details στο κάτω βελάκι, αντί του DataGridView που είδαμε προηγουμέ-

νως, όταν φτιάχναμε το πλέγμα. Είναι βολικό ότι για κάθε πεδίο μας δεί-

10

Υπενθυμίζω ότι φτιάχνουμε ένα ευρετήριο σε ένα πεδίο όταν κάνουμε συχνά αναζητήσεις με βάση τιμές αυτού του πεδίο. Τα

ξένα κλειδιά είναι πρώτη επιλογή για τη δημιουργία ευρετηρίων.

Εικόνα 21 Δεδομένα στη SailingDB

Εικόνα 22 Το SailingDBDataSet

Εικόνα 23 Φόρμα πλέγματος για τύπους σκαφών

Page 14: Σημειώσεις για βάσεις δεδομένων Client Server

IEK ΣΥΡΟΥ 2013 Γλώσσα Προγραμματισμού V Τεχνικός Εφαρμογών Πληροφορικής

Σελ. 14 27-Μαϊ-14 [email protected]

χνει τι χειριστήριο θα χρησιμοποιήσει για να το προβάλει πάνω στη φόρμα. Έτσι βλέπουμε στην Εικόνα 22 ότι τα πεδία συμβο-

λοσειρών και αριθμών τα προβάλει με πλαίσια κειμένου, το πεδίο SkafosEnergo που είναι τύπου Bit με CheckBox και την ημε-

ρομηνία με ένα χειριστήριο τύπου DateTimePicker (θα δείτε πόσο εξυπηρετικό είναι για την εισαγωγή και πόσο πρακτικό για την

εμφάνιση ημερομηνιών όταν τρέξετε τη φόρμα). Μόνο για το πεδίο SkafosTypos, αλλάξτε τον τύπο χειριστηρίου από TextBox σε

ComboBox. Το ComboBox ή σύνθετο πλαίσιο είναι μια αναδιπλούμενη λίστα από όπου μπορείς να επιλέγεις ένα στοιχείο.

Από το παράθυρο Data Sources, σύρετε τον πίνακα Skafi πάνω στη φόρμα frmSkafi. Κατά τα αναμενόμενα, θα φτιάξει ετικέτες

και τα κατάλληλα χειριστήρια για όλα τα πεδία του πίνακα και έναν DataNavigator για την πλοήγηση στις εγγραφές (Εικόνα 24).

Χτενίστε τη φόρμα φτιάχνοντας τις λεπτομέρειες, όπως τα ονόματα των πεδίων στις ετικέτες, το μέγεθος των πλαισίων κειμένου,

κ.λπ.

Για να βλέπετε τη νέα φόρμα, όπως και την προηγούμενη που φτιάξαμε και

την επόμενη που έπεται, φτιάξτε μια frmKyria με τρία κουμπιά που κάνουν

.Show την αντίστοιχη φόρμα11

. Από το Project, Sailing Properties κάντε

Startup Form = frmKyria.

Όμορφα, αλλά το σύνθετο πλαίσιο για τον τύπο σκάφους δεν λειτουργεί

όπως θα θέλαμε. Ο χρήστης δεν ενδιαφέρεται ποιος είναι ο κωδικός του

τύπου σκάφους, αλλά το όνομά του. Για να το διορθώσουμε, σέρνουμε

πάνω στο σύνθετο πλαίσιο τον πίνακα TyposSkafous από το Data Sources.

Τότε αντικαθιστά την τιμή του κλειδιού, με την περιγραφή του τύπου σκά-

φους. Ανοίγουμε τις ιδιότητες του σύνθετου πλαισίου με το μαύρο τριγω-

νάκι και βλέπουμε τι συνέβη πίσω από την κουρτίνα. Με αυτό τον τρόπο

μπορούμε να εμφανίσουμε σε μια φόρμα πεδία που ανήκουν σε άλλον πί-

νακα από το DataSet της φόρμας. Είναι αυτό που λέμε πεδία αναζήτησης

(lookup fields).

Υποθέτω ότι έχετε κάνει την επέκταση της ΒΔ για τους ιστιοπλόους και τα πληρώματα. Τώρα είναι η στιγμή να φτιάξετε φόρμα

για τους ιστιοπλόους, πλέγματος ή αναλυτική, ό,τι γουστάρετε – είναι εύκολη. Έπειτα συνεχίστε με μια φόρμα για τον πίνακα των

πληρωμάτων όπου καταγράφεται ποιος ιστιοπλόος ήταν πλήρωμα σε ποιο σκάφος. Σε αυτή τη φόρμα θα έχετε δυο πεδία αναζή-

τησης – καλό για εξάσκηση.

4.3 Πεδίο αναζήτησης

Οι αλλαγές που κάναμε μέχρι τώρα στη φόρμα με το πλέγμα ήταν περισσότερο διακοσμητικές. Τα πεδία πάνω στο πλέγμα από

κατασκευής τους είναι πλαίσια κειμένου (TextBox), εκτός από τα πλαίσια ελέγχου (CheckBox) που προβάλουν δεδομένα τύπου

Bit. Τώρα θα αντικαταστήσουμε το πλαίσιο κειμένου που προβάλει ένα ξένο κλειδί με την περιγραφική πληροφορία που αντι-

στοιχεί σε αυτό το κλειδί. Την ίδια δουλειά κάναμε και στην προηγούμενη παράγραφο, αλλά εκεί ήταν λίγο αυτοματοποιημένη

διαδικασία. Ας δούμε πώς θα φτιάξουμε ένα πεδίο αναζήτησης μόνοι μας.

Ας φτιάξουμε μια φόρμα πλέγματος με τα σκάφη στα γρήγορα. Από το παράθυρο Data Sources σέρνουμε το αντίστοιχο DataSet

πάνω σε μια κενή φόρμα. Ωστόσο, το δεύτερο πεδίο SkafosTypos μας χαλάει. Αντί για 1, θέλουμε να εμφανίζει Optimist. Δεν

είναι μόνο θέμα ευχρηστίας, αλλά και πρόληψης σφαλμάτων: αν ο χρήστης διορθώσει σε 4 τον τύπο σκάφους, το πρόγραμμα θα

"χτυπήσει" γιατί δεν υπάρχει τέτοιος τύπος σκάφους. Για να τον προστατέψουμε, δεν θα τον αφήσουμε να πληκτρολογεί ό,τι θέ-

λει μέσα στο πλαίσιο κειμένου γι' αυτό το πεδίο, αλλά θα επιλέγει από ένα σύνθετο πλαίσιο (ComboBox) μόνο τις νόμιμες τιμές

και μάλιστα όχι το κλειδί, αλλά την περιγραφή.

Πηγαίνουμε λοιπόν στην προβληματική εκδοχή του πλέγματος πάνω στη φόρμα και με Edit Columns επιλέγουμε τη στήλη

SkafosTypos. Στα δεξιά είναι οι Bound Column Properties όπου αλλάζουμε ColumnType σε DataGridViewComboBoxColumn.

Έπειτα συμπληρώνουμε τις εξής ιδιότητες:

DataSource όπου επιλέγουμε τον πίνακα TyposSkafous από

όπου θα αντλεί τις γραμμές του το σύνθετο πλαίσιο

DisplayMember = TyposOnoma που είναι το πεδίο του πί-

νακα TyposSkafous που θα εμφανίζεται στο σύνθετο

πλαίσιο

ValueMember = TyposId που είναι το πεδίο του πίνακα

TyposSkafous που θα στέλνεται προς αποθήκευση

Επίσης σημαντική είναι και η ιδιότητα DataPropertyName

που είναι το πεδίο στο οποίο θα αποθηκεύεται η τιμή του πε-

δίου ValueMember, αλλά αυτό δεν το πειράζουμε (=

SkafosTypos), γιατί είναι σωστό από την (αυτόματη) κατασκευή του πλέγματος.

Το κόλπο που μας δίνει το σύνθετο πλαίσιο είναι ότι, άλλες τιμές προβάλει στη λίστα του όταν το ξεδιπλώσεις (συνήθως περι-

γραφικές συμβολοσειρές), και άλλη τιμή αποθηκεύει (συνήθως το κλειδί του συνδεδεμένου πίνακα) μέσα στο δεσμευμένο πεδίο

της φόρμας (το ξένο κλειδί). Δείτε το αποτέλεσμα στην Εικόνα 25, όπου έχουμε αλλάξει και την εμφάνιση των στηλών (τίτλοι,

στοίχιση, κ.λπ).

11

Αντί για την μέθοδο ΌνομαΦόρμας.Show(), μπορείτε να χρησιμοποιήσετε την παραλλαγή .ShowDialog(). Δοκιμάστε τη να

δείτε τη διαφορετική συμπεριφορά.

Εικόνα 24 Φόρμα λεπτομερειών για σκάφη

Εικόνα 25 Σύνθετο πλαίσιο σε πλέγμα

Page 15: Σημειώσεις για βάσεις δεδομένων Client Server

Τεχνικός Εφαρμογών Πληροφορικής Γλώσσα Προγραμματισμού V IEK ΣΥΡΟΥ 2013

[email protected] 27-Μαϊ-14 Σελ. 15

4.4 Κύρια-δευτερεύουσα φόρμα

Φόρμες τύπου κύρια-δευτερεύουσα (master-detail) συνηθίζονται όταν χρειάζεται να απεικονίσουμε σε μια οθόνη μια σχέση

ένα-προς-πολλά. Στην οθόνη τότε εμφανίζονται σε αναλυτική μορφή τα πεδία του πίνακα από τη μεριά του ένα (είναι η κύρια

φόρμα–master) και σε συνοπτική μορφή πλέγματος τα πεδία του πίνακα από τη μεριά του πολλά (είναι η δευτερεύουσα φόρμα–

detail).

Στο παράδειγμα που τρέχουμε τώρα, ένας τύπος σκάφους σχετίζεται με πολλά σκάφη και κάθε σκάφος έχει έναν τύπο, άρα όπως

έχουμε διαγνώσει από την αρχική σχεδίαση της SailingDB, είναι μια σχέση ένα-προς-πολλά και αυτό φαίνεται και από τη γραμμή

στην Εικόνα 20.

Εισάγουμε μια νέα φόρμα frmTyposKaiSkafi στο έργο. Από το παράθυρο Data Sources επιλέγουμε τον πίνακα Ty-

posSkafous και με κλικ πάνω στο μαύρο τριγωνάκι του επιλέγουμε Details. Σέρνουμε το TyposSkafous πάνω στη

φόρμα. Φτιάχνει τα χειριστήρια για μια αναλυτική παρουσίαση της κάθε εγγραφής. Προσαρμόζουμε τις ετικέτες, τη

θέση, το μέγεθος κατά τα γνωστά.

Και τώρα λίγη προσοχή: πηγαίνουμε στο παράθυρο Data Sources

και επιλέγουμε τον πίνακα Skafi που εμφανίζεται κάτω και μέσα

στον πίνακα TyposSkafous, ως ένα πεδίο του. Προσοχή: όχι τον

TyposSkafous που εμφανίζεται πάνω. Στο μαύρο τριγωνάκι του

πίνακα διαλέγουμε DataGridView και τον σέρνουμε πάνω στη

φόρμα.

Μετά από κάμποσες προσαρμογές στα πεδία του πλέγματος (πχ δεν

χρειάζεται να φαίνεται ο κωδικός του τύπου σκάφους και το κά-

νουμε αόρατο, ιδιότητα Visible = False), η φόρμα θα δείχνει όπως

στην Εικόνα 26. Παρατηρήστε ότι πλοηγούμενοι στις εγγραφές των

τύπων σκαφών, η δευτερεύουσα φόρμα προβάλει μόνο τα σκάφη

του συγκεκριμένου τύπου.

Το κρίσιμο βήμα ήταν η επιλογή του "σωστού" πίνακα Skafi από το

Data Sources. Αυτό που επιλέξαμε απεικονίζει ουσιαστικά τη σχέ-

ση που υπάρχει ανάμεσα στους δυο πίνακες. Χωρίς την κατάλληλη

σχέση στο σχήμα της ΒΔ δεν είναι εύκολο να φτιαχτούν (χωρίς

έξτρα κώδικα) κύριες-δευτερεύουσες φόρμες ή πεδία αναζήτησης

που είδαμε στις δυο τελευταίες ενότητες.

Που μας δίνει μια καλή συμβουλή για το κλείσιμο. Όλα ξεκινούν από τη σωστή σχεδίαση της ΒΔ. Χωρίς επαναλαμβανόμενα

πεδία, με την σωστή απεικόνιση σχέσεων μεταξύ των πινάκων και στην κατάλληλη κανονική μορφή.

Εικόνα 26 Φόρμα κύρια-δευτερεύουσα

Page 16: Σημειώσεις για βάσεις δεδομένων Client Server

IEK ΣΥΡΟΥ 2013 Γλώσσα Προγραμματισμού V Τεχνικός Εφαρμογών Πληροφορικής

Σελ. 16 27-Μαϊ-14 [email protected]

Εικόνα 28 Εκτέλεση του ερωτήματος

5. Αναζήτηση Στο προηγούμενο κεφάλαιο φτιάξαμε φόρμες για το πρόγραμμα-πελάτης που διαχειρίζονται τα δεδομένα από τη ΒΔ στον εξυπη-

ρετητή. Εδώ θα δώσουμε τη δυνατότητα αναζήτησης μέσα από τις φόρμες.

Ας επικεντρώσουμε στη απλή φόρμα που φαίνεται στην Εικόνα 24 και προβάλει τα ιστιοπλοϊκά του στόλου του ομίλου. Μπο-

ρούμε να μετακινηθούμε στις εγγραφές (πρώτη, προηγούμενη, σε συγκεκριμένη εγγραφή, πχ 3η, επόμενη, τελευταία. Επίσης μπο-

ρούμε να προσθέσουμε νέα εγγραφή, να διαγράψουμε και να αλλάξουμε μια υπάρχουσα. Όλα αυτά μας τα παρέχει ο Binding-

Navigator και μας καλύπτουν όσο το πλήθος των εγγραφών είναι μικρό. Όταν όμως ο στόλος γίνει αρμάδα, χρειάζεται να αναζη-

τούμε, πχ με βάση το όνομα του σκάφους. Θα υλοποιήσουμε λοιπόν το φιλτράρισμα των εγγραφών του πίνακα. Ας ξεκινήσουμε

τη διαδικασία που αποτελείται από δυο βήματα: τον ορισμό του ερωτήματος που θα εφαρμόζεται για το φιλτράρισμα και την ε-

κτέλεσή του πάνω από τη φόρμα.

Ορισμός ερωτήματος φιλτραρίσματος Στο έργο Sailing και πηγαίνουμε

στο παράθυρο Data Sources, όπου

επιλέγουμε από το μενού του Edit

DataSet with Designer. Μας ανοί-

γει μια γραφική απεικόνιση του

DataSet, όπου φαίνονται οι πίνακες με τα πεδία

και τα κλειδιά τους και οι σχέσεις μεταξύ τους

(δείτε Εικόνα 27). Είναι παρόμοιο με το αντί-

στοιχο διάγραμμα της ΒΔ που είχαμε δει στην

Εικόνα 20 και αυτό είναι λογικό, αφού η λει-

τουργία του DataSet είναι για να αντικατοπτρί-

ζει τη δομή της ΒΔ στη μνήμη για να μπορούμε

να χειριζόμαστε τα περιεχόμενά της από τη

VB12

. Κάτω από τα στοιχεία του κάθε πίνακα

βλέπουμε τον αντίστοιχο TableAdapter που

υπεύθυνος για τη σύνδεση με τη ΒΔ, την εκτέλεση του ερωτήματος και το γέμισμα του πίνακα.

Στον SkafiTableAdapter με δεξί κλικ επιλέγουμε Add, Query... για να εισάγουμε το ερώτημα που θα επιλέγει τις εγγραφές με

βάση το φίλτρο. Στο μάγο ακολουθείτε τα βήματα κάνοντας τις επιλογές Use SQL statements και έπειτα SELECT which returns

rows που οδηγεί στο παράθυρο Specify a SQL SELECT statement. Εκεί γράφετε

SELECT *

FROM Skafi

WHERE SkafosOnoma LIKE '%' + @parSkafosOnoma + '%'

που επιλέγει όλα τα σκάφη που μέσα στο όνομά τους έχουν τη συμβολοσειρά @parSkafosOnoma. Αυτό το μυστήριο πράγμα

είναι μια παράμετρος, γι' αυτό της έβαλα πρόθεμα par. Επιπρόσθετα, ο SQL Server απαιτεί οι παράμετροι των ερωτημάτων του

να ξεκινούν με το @. Ιδιοτροπίες! Ελπίζω να θυμόσαστε ότι κριτήρια του στιλ

topos LIKE %αλα%

επιστρέφουν τις εγγραφές που το πεδίο topos έχει τιμές όπως 'Τρικαλα', 'Καλαμπακα', 'Αλαμανα'.

Ο μάγος θα σας ζητήσει να ονομάσετε τις μεθόδους και του δίνουμε FillBySkafosOnoma και GetDataBySkafosOnoma – όχι πώς

έχουν τίποτα το ιδιαίτερο. Και φτάσαμε επιτέλους στο Finish.

Παρατηρήστε στο διάγραμμα τώρα στον SkafiTableAdapter έχουν εμφανιστεί και οι δυο νέες μέθοδοι.

Εκτέλεση από τη φόρμα Πάμε τώρα στον Solution Explorer που δείχνει τα βασικά συ-

στατικά του έργου και ανοίγουμε τη φόρμα frmSkafi. Εντοπί-

ζουμε κάτω από το παράθυρο σχεδίασης της φόρμας μαζεμένα

όλα τα μη οπτικά χειριστήρια της φόρμας που δεν έχει νόημα να

τα προβάλει πάνω στο χώρο της. Εκεί διαλέγουμε το SkafiTa-

bleAdapter και επιλέγουμε με δεξί κλικ Add Query... Στο παρά-

θυρο που ανοίγει κάνουμε Select data source table το Sailing-

DBDataSet.Skafi και Existing query name = FillBySkafosOno-

FillBySkafosOnoma(parTyposOnoma) και ΟΚ. Του είπαμε να

φτιάξει πάνω στη φόρμα ό,τι χρειάζεται για να φιλτράρουμε

εγγραφές και ορίσαμε το ερώτημα που είναι υπεύθυνο για το

φιλτράρισμα.

12

Η ομορφιά του DataSet είναι ότι, όχι απλώς διατηρεί τα δεδομένα εύκαιρα για αλλαγές από τη γλώσσα προγραμματισμού, αλλά

φροντίζει να επιβάλει και τους κανόνες που ισχύουν μέσα στη ΒΔ: φροντίζει οι νέες τιμές των δεδομένων να ταιριάζουν με τους

τύπους δεδομένων, να τηρούν τους κανόνες ακεραιότητας – τόσο τα CHECK constraints, όσο και την ακεραιότητα αναφορών

(referential integrity) που προκύπτει από τις σχέσεις.

Εικόνα 27 Διάγραμμα του DataSet

Page 17: Σημειώσεις για βάσεις δεδομένων Client Server

Τεχνικός Εφαρμογών Πληροφορικής Γλώσσα Προγραμματισμού V IEK ΣΥΡΟΥ 2013

[email protected] 27-Μαϊ-14 Σελ. 17

Αυτό ήταν. Στη φόρμα εμφανίζεται άλλη μια λωρίδα εργαλείων (χειριστή-

ριο ToolStrip) που μας δίνει τη δυνατότητα να κάνουμε το φιλτράρισμα.

Περιέχει από αριστερά προς τα δεξιά:

μια ετικέτα (αλλάξτε την σε 'Όνομα:'),

ένα πλαίσιο κειμένου για να γράψουμε το κείμενο που θα αναζητήσει

το φίλτρο, και

ένα πλήκτρο για να εκτελεστεί το φίλτρο (αλλάξτε το Text σε 'Φίλτρο'

ή μπορείτε να ορίσετε να προβάλει ένα Image και να διαλέξετε το φα-

κό).

Επειδή η διαδικασία μου φάνηκε λίγο μαγική, ας την επαναλάβουμε με ένα

ακόμη παράδειγμα.

5.1 Φίλτρο σε ξένο πίνακα

Θα προσθέσουμε άλλο ένα φίλτρο στη φόρμα που θα επιλέγει όλα τα σκά-

φη συγκεκριμένου τύπου. Η διαδικασία δεν διαφέρει πολύ από την προη-

γούμενη μόνο που εμπλέκονται δυο πίνακες γιατί ο Skafi αποθηκεύει μόνο

τον κωδικό του τύπου, ενώ εμείς θέλουμε να φιλτράρουμε με το όνομα του

τύπου σκάφους. Ξεκινάμε λοιπόν πάλι από το διάγραμμα του DataSet, επιλέγουμε το SkafiTableAdapter και κάνουμε Add, Query

όπου θα γράψουμε ένα πιο σύνθετο ερώτημα:

SELECT Skafi.*, TyposSkafous.TyposOnoma

FROM Skafi INNER JOIN TyposSkafous ON SkafosTypos = TyposId

WHERE TyposOnoma LIKE '%' + @parTyposOnoma + '%'

που

κάνει σύνδεση των δυο πινάκων με

το κοινό τους πεδίο (FROM)

επιστρέφει όλα τα πεδία του πίνακα

Skafi και το πεδίο TyposOnoma του

TyposSkafi (SELECT)

επιλέγει τις εγγραφές που κάπου μέ-

σα στο πεδίο TyposOnoma περιέ-

χουν την τιμή της παραμέτρου

(WHERE).

Αν το φέρνετε βαριά να γράψετε SQL

κώδικα, μπορείτε να χρησιμοποιήσετε

τον Query Builder για να κάνετε την ίδια

δουλειά. Θα συνιστούσα μάλιστα να χρη-

σιμοποιήσετε και το Execute Query για

να δοκιμάσετε το ερώτημα. Στην Εικόνα

30 βλέπετε και το αποτέλεσμα όταν δώ-

σετε τιμή 'ptim' στην @parTyposOnoma,

οπότε εμφανίζει τα σκάφη τύπου

optimist. Ας εγκαταλείψουμε τώρα τον

Query Builder.

Ονομάζουμε τις μεθόδους

FillByTyposOnoma και

GetDataByTyposOnoma.

Στο επόμενο βήμα από ανοίγουμε τη φόρμα frmSkafi. Εντοπίζουμε το SkafiTableAdapter και επιλέγουμε με δεξί κλικ Add

Query... Στο παράθυρο που ανοίγει βάζουμε data source table το SailingDBDataSet.Skafi και Existing query name =

FillByTyposOnoma(parTyposOnoma) και ΟΚ. Τέλος.

Αποκλείεται να τα συγκρατήσετε όλα αυτά τα βήματα αν δεν κάνετε μόνοι σας μερικά αντίστοιχα φίλτρα στις υπόλοιπες φόρμες

που έχουμε φτιάξει. Επανάληψη, λοιπόν!

Συνοψίζοντας, για το φιλτράρισμα τα βασικά βήματα είναι να ορίσουμε το ερώτημα που θα εκτελείται για την επιλογή των εγ-

γραφών και να τοποθετήσουμε στη φόρμα τη λωρίδα που θα εκτελεί το ερώτημα και θα φιλτράρει τις εγγραφές.

Εικόνα 30 Ο Query Builder θυμίζει τη σχεδίαση ερωτημάτων στην Access.

Εικόνα 29 Φόρμα με φίλτρο

Page 18: Σημειώσεις για βάσεις δεδομένων Client Server

IEK ΣΥΡΟΥ 2013 Γλώσσα Προγραμματισμού V Τεχνικός Εφαρμογών Πληροφορικής

Σελ. 18 27-Μαϊ-14 [email protected]

6. Εξαιρέσεις Μέχρι τώρα στις εφαρμογές που φτιάξαμε, περίπου με αυτόματο πιλότο, συμπεριφερθήκαμε με ευγένεια και προσοχή. Προσέχα-

με να τις ταΐζουμε με νόμιμα δεδομένα και προσποιηθήκαμε ότι δεν βλέπαμε τα σφάλματα που έσκαγαν δεξιά και αριστερά προ-

καλώντας την άμεση διακοπή της εκτέλεσης. Ας γίνουμε ρεαλιστές τώρα.

Οι απλοί χρήστες που εκτελούν την εφαρμογή είναι άσχετοι, απρόσεκτοι, ως και κακοήθεις. Άρα η εφαρμογή μας πρέπει να μπο-

ρεί να αντιμετωπίζει με στωικότητα τις μπουνιές και τις κλωτσιές που τρώει. Αυτό γίνεται χρησιμοποιώντας τον μηχανισμό των

εξαιρέσεων. Όταν κάτι πάει στραβά, εγείρεται ή πυροδοτείται μια εξαίρεση. Στην απλούστερη περίπτωση, η εφαρμογή θα

τερματίσει, αφήνοντάς μας σύξυλους. Στην πιο ευνοϊκή περίπτωση θα μας ανακοινώσει ένα μήνυμα σφάλματος και μετά θα τερ-

ματίσει (Εικόνα 31). Εμείς θα θέλαμε όταν εγερθεί η εξαίρεση, να αναγνωρίσουμε τι πήγε στραβά και να αντιμετωπίσουμε αυτή

την προβληματική κατάσταση. Η διαδικασία αυτή ονομάζεται χειρισμός εξαίρεσης (exception handling).

Ο χειρισμός εξαιρέσεων γίνεται στις περισσότερες γλώσσες προγραμματισμού από μια γλωσσική κατασκευή που έχει τη μορφή

της εντολής Try...Catch. Η λειτουργία της εντολής αυτής είναι να περικυκλώνει τον επικίνδυνο κώδικα και να έχει τεντωμένα τα

αυτιά μήπως και εγερθεί κάποια εξαίρεση. Όταν αυτό συμβεί, προ-

σπαθεί να αναγνωρίσει τι σόι εξαίρεση έσκασε. Αν την αναγνωρί-

σει, μπορεί να προσπαθήσει να αντιμετωπίσει το πρόβλημα που την

προκάλεσε, ή απλώς να ανακοινώσει ένα μήνυμα. Η απλούστερη

μορφή της εντολής χειρισμού εξαιρέσεων είναι

Try

κώδικας που μπορεί να εγείρει εξαίρεση

Catch ex As Exception

κώδικας που αναγνωρίζει την εξαίρεση

και την αντιμετωπίζει

End Try

Στην Εικόνα 32 είναι το πιο χαζό παράδειγμα μιας εντολής χειρι-

σμού εξαιρέσεων, όπου διαπιστώνουμε το σφάλμα, το ανακοινώ-

νουμε, το διορθώνουμε και η εκτέλεση προχωράει κανονικά.

6.1 Εξαιρέσεις από το ΣΔΒΔ

Θα σας έχει συμβεί να πάτε να τρέξετε κάποιο από τα παραδείγμα-

τα που γράφουμε και να έχετε ξεχάσει να εκκινήσετε τον εξυπηρε-

τητή της ΒΔ. Μόλις το

πρόγραμμα πάει να ανοί-

ξει μια φόρμα και ζητάει

τα δεδομένα που θέλει να

προβάλει από τον data-

base server, τρώει πόρτα

και τερματίζει. Ας το κά-

νουμε να δείχνει πιο φιλι-

κή συμπεριφορά.

Ανοίγουμε τον κώδικα

πίσω από τη φόρμα (διπλό

κλικ πάνω της) και πηγαί-

νουμε στο συμβάν _Load

που εκτελείται κατά την

φόρτωση της φόρμας.

Εκεί υπάρχει μια εντολή

που "γεμίζει" τη φόρμα με

τα δεδομένα – την έβαλε

εκεί ο μάγος και δεν την

πειράζουμε. Απλώς την

περικλείουμε σε μια

Try...Catch, όπως φαίνε-

Εικόνα 31 Έγερση εξαίρεσης μέσα στο περιβάλλον ανάπτυξης

Dim a, b, c As Integer Try a = 3 b = 0 c = a \ b Catch ex As Exception MessageBox.Show("Σφάλμα: " & ex.Message) c = 0 End Try MessageBox.Show("Αποτέλεσμα: " & c)

Εικόνα 32 Χειρισμός εξαίρεσης

Private Sub frmPliroma_Load... Try Me.NaftikoiTableAdapter.Fill(Me.SailingDBDataSet.Naftikoi) Catch ex As SqlException MessageBox.Show("Σφάλμα " & ex.Number & " " & ex.Message & vbCrLf & _ "Άντε να εκκινήσεις τον SQLEXPRESS από Υπηρεσίες.") Application.Exit() End Try End Sub

Εικόνα 33 Εξαίρεση για τη ΒΔ

Page 19: Σημειώσεις για βάσεις δεδομένων Client Server

Τεχνικός Εφαρμογών Πληροφορικής Γλώσσα Προγραμματισμού V IEK ΣΥΡΟΥ 2013

[email protected] 27-Μαϊ-14 Σελ. 19

ται στην Εικόνα 33.

Άμα συμπληρώσετε τον κώδικα στο άσπρο φόντο θα σας χτυπήσει ένα συντακτικό λάθος στη λέξη SqlException ότι δεν την ανα-

γνωρίζει (Type 'SqlException' is not defined.), διότι δεν έχετε περιλάβει την βιβλιοθήκη που ανήκει. Ο πιο απλός τρόπος για να το

διορθώσετε είναι αποδεχθείτε την πρώτη επιλογή που σας προτείνει το περιβάλλον ανάπτυξης. Τότε θα προσθέσει μια εντολή

Imports System.Data.SqlClient

στο ξεκίνημα του κώδικα που δηλώνει τη βιβλιοθήκη στην οποία ανήκει η SqlException που θέλουμε να συλλάβουμε.

Η εντολή Application.Exit() τερματίζει την εκτέλεση της εφαρμογής – είναι ο πολιτικώς ορθός τρόπος στη VB.NET να γράψουμε

την απλή εντολή End της παλιάς Basic (που, παρεμπιπτόντως, δουλεύει ακόμη). Τρέχουμε και απολαμβάνουμε.

6.2 Έλεγχος ορθότητας δεδομένων

Τα δεδομένα που εισάγει ο χρήστης στη φόρμα μπορεί να

παραβιάζουν τους κανόνες του πίνακα, είτε τη μοναδικότη-

τα του κλειδιού, είτε την υποχρεωτική συμπλήρωση τιμής

(Not Null), είτε κάποιο άλλο κανόνα ακεραιότητας (Check

Constraint). Όταν συμβεί κάτι από όλα αυτά, ο εξυπηρετη-

τής ΒΔ αρχίζει τις χριστοπαναγιές (για να ακριβολογούμε,

εγείρει εξαίρεση). Μέχρι τώρα οι φόρμες που φτιάχναμε

σφύριζαν αδιάφορα και βέβαια το πρόγραμμα κρεμούσε.

Τώρα θα προσθέσουμε κώδικα που ακούει τις φωνές της ΒΔ

και ενημερώνει το χρήστη.

Ας πάρουμε μια απλή φόρμα πλέγματος. Ανοίγουμε τον

κώδικα της φόρμας και στο αριστερό σύνθετο πλαίσιο που

περιέχει τα χειριστήρια της φόρμας επιλέγουμε το χειριστή-

ριο του πλέγματος, πχ το NaftikoiDataGridView. Δίπλα, στο

δεξί σύνθετο πλαίσιο που περιέχει τα συμβάντα του πλέγμα-

τος, επιλέγουμε DataError και μας φτιάχνει το άδειο σκελε-

τό του συμβάντος που εκτελείται όποτε συμβαίνει κάποιο

λάθος στα δεδομένα του πλέγματος. Συμπληρώνουμε την

εντολή MessageBox.Show, όπως στην Εικόνα 34, που προ-

βάλει το μήνυμα που ανακοινώνει η ΒΔ με τα διακοσμητικά

(Caption, Buttons, Icon).

Αυτό το περίεργο αντικείμενο e είναι μια παράμετρος του

συμβάντος DataError – το βρίσκουμε στην επικεφαλίδα του

συμβάντος. Το e έχει διάφορες χρήσιμες ιδιότητες, όπως την

.RowIndex που είναι η γραμμή του πλέγματος που προκά-

λεσε το σφάλμα και την .Exception που είναι η εξαίρεση

που εγέρθηκε. Τις χρησιμοποιούμε στον κώδικα που γρά-

φουμε για να κάνουμε το μήνυμα πιο ενημερωτικό για το χρήστη.

Επιτυχία! Βλέπετε ενημερωτικά μηνύματα για το λόγο που η εγγραφή στο πλέγμα δεν μπορεί να αποθηκευτεί στον πίνακα της

ΒΔ.

Private Sub NaftikoiDataGridView_DataError (ByVal sender As Object, ByVal e As System.Windows.Forms. DataGridViewDataErrorEventArgs) Handles NaftikoiDataGridView.DataError MessageBox.Show( _ "Γραμμή: " & (e.RowIndex + 1) & vbCrLf & _ "Σφάλμα: " & e.Exception.Message, _ "Σφάλμα δεδομένων", _ MessageBoxButtons.OK, _ MessageBoxIcon.Exclamation) End Sub

Εικόνα 34 Έλεγχος δεδομένων

Page 20: Σημειώσεις για βάσεις δεδομένων Client Server

IEK ΣΥΡΟΥ 2013 Γλώσσα Προγραμματισμού V Τεχνικός Εφαρμογών Πληροφορικής

Σελ. 20 27-Μαϊ-14 [email protected]

7. Προγραμματισμός χωρίς μάγια Μέχρι τώρα χρησιμοποιώντας εκτεταμένα τα βοηθήματα του περιβάλλοντος ανάπτυξης (wizards) χρειάστηκε να γράψουμε λίγο

κώδικα για να προσπελάσουμε τα δεδομένα της ΒΔ. Σε γενικές γραμμές καταλάβαμε ότι ο προγραμματισμός του πελάτη περι-

λαμβάνει τα εξής βήματα:

Σύνδεση με τη ΒΔ Το «σπίτι» των δεδομένων είναι η ΒΔ όπου ο εξυπηρετητής (database server) τηρεί με αυστηρούς κανόνες

την ακεραιότητα και συνέπεια. Στην περίπτωσή μας database server είναι ένα στιγμιότυπο του SQL Server, αλλά μπορεί να

είναι μια εγκατάσταση της Oracle ή κάποιου άλλου ΣΔΒΔ. Στη ΒΔ αποθηκεύονται τα δεδομένα με ασφάλεια και αξιοπιστία

και μόνο εκεί δεν κινδυνεύουν από σφάλματα του χρήστη, κολλήματα του υπολογιστή, ή διακοπές ρεύματος της ΔΕΗ.

Προετοιμασία της εφαρμογής να παραλάβει δεδομένα Για να βγουν τα δεδομένα από τη ΒΔ, η εφαρμογή πρέπει να ετοιμά-

σει την κατάλληλη υποδομή που θα τα φιλοξενήσει σεβόμενη τη δομή τους, τους τύπους δεδομένων τους και έχοντας υπόψη

και το μέγεθός τους. Είναι σαν ο ξενοδόχος να ετοιμάζει τα δωμάτια που θα διανυκτερεύσει ένα γκρουπ τουριστών, λαμβά-

νοντας υπόψη τα ιδιαίτερα χαρακτηριστικά τους.

Μεταφορά δεδομένων από τη ΒΔ στην εφαρμογή Μόλις στρώσει τα κρεβάτια, ο ξενοδόχος, ειδοποιεί τους μουσαφίρηδες να

έλθουν. Ήδη από το πρώτο βήμα έχει στρωθεί ο ασφαλτοτάπητας από το σπίτι ως το ξενοδοχείο. Κουβαλιούνται λοιπόν και

χουζουρεύουν στην προσωρινή τους διαμονή.

Προβολή δεδομένων σε μια φόρμα Τώρα που τακτοποιήθηκαν στο ξενοδοχείο, μπορούν να βγουν στο μπαλκόνι και να τα

θαυμάσει ο κόσμος. Όσο καιρό τα δεδομένα παρέμεναν μέσα στο σπίτι τους, μόνο αυτός ο παράξενος διαχειριστής της ΒΔ

μπορούσε να τα ψαχουλεύει.

Διόρθωση δεδομένων πάνω στη φόρμα Τα δεδομένα πάνω στη φόρμα είναι ευάλωτα: καθένας μπορεί να τα τροποποιήσει, να

τα σβήσει, ή να προσθέσει νέα μέλη. Ευτυχώς οι αλλαγές δεν επηρεάζουν τα πρωτότυπα δεδομένα που παραμένουν ασφαλή

και ανέγγιχτα στο σπίτι. Εξαιτίας της ασυδοσίας που κυριαρχεί στο ξενοδοχείο, μπορεί να παραβιαστούν οι κανόνες που ί-

σχυαν μέσα στο σπίτι, πχ ότι δεν πρέπει να κάνεις σχέσεις με άγνωστους :-)

Έλεγχος εγκυρότητας των αλλαγμένων δεδομένων της φόρμας Μετά από οποιεσδήποτε αλλαγές, ή ακόμη κι αν δεν γίνει

καμιά αλλαγή13

, τα δεδομένα πρέπει να ελεγχθούν πριν να επιστρέψουν σπίτι τους.

Αποθήκευση δεδομένων στον πίνακα της ΒΔ Τα δεδομένα ακολουθώντας την αντίθετη διαδρομή επιστρέφουν στο σπίτι τους.

Στην πόρτα θα υποβληθούν σε αυστηρό έλεγχο από τον φύλακα-άγγελό τους, και –αν τα βρει εντάξει- θα μπορέσουν να

μπουν στη ΒΔ.

Όλα αυτά τα βήματα διεκπεραιώθηκαν από αυτόματες κατασκευές στα προηγούμενα. Δεν ήταν κι άσχημα. Θυμηθείτε ότι ήταν ο

βασικός λόγος που διαλέξαμε τη Visual Basic. Άλλα τώρα ήρθε το πλήρωμα του χρόνου για να φτάσουμε σε ανάλογο αποτέλε-

σμα γράφοντας κώδικα. Η αλήθεια είναι ότι μόνο έτσι έχουμε πλήρη έλεγχο στη λειτουργία της εφαρμογής πελάτη. Και ελπίζω

ότι μετά την τριβή που αποκτήσαμε με τα προηγούμενα, ο κώδικας θα είναι πιο κατανοητός.

7.1 Η ΒΔ MovieDb

Σε αυτό το κεφά-

λαιο θα ξεκινή-

σουμε ένα νέο

παράδειγμα με

μια απλή ΒΔ για ταινίες.

Φτιάχνουμε ένα νέο VB pro-

ject τύπου Windows Form

Application και το ονομάζου-

με DataProApp.

Στον Database Explorer επι-

λέγουμε Connect to Database,

με Data Source Microsoft

SQL Server και δίνουμε File-

name = MovieDb.mdf. Έτσι δημιουργείται μια νέα, κενή ΒΔ στην οποία προσθέτουμε νέο πίνακα tblMovies του οποίου η σχεδί-

αση φαίνεται στην Εικόνα 35. Ο πίνακας έχει και έναν κανόνα ακεραιότητας Eispraxeis >= 0.0. Υπενθυμίζω ότι η παραπάνω δια-

δικασία θα μπορούσε να έχει γίνει και με το περιβάλλον διαχείρισης SQL Server Management Studio ή απλώς γράφοντας DDL

διαταγές της SQL σε οποιοδήποτε ΣΔΒΔ (δείτε στην τελευταία παράγραφο της ενότητας 7.7). Εισάγουμε 3-4 εγγραφές στον πί-

νακα και είμαστε έτοιμοι από τη μεριά του εξυπηρετητή της ΒΔ.

Ας ξεκινήσουμε τώρα τα βήματα του προγραμματισμού της εφαρμογής-πελάτη. Θα είναι απλή, με μια φόρμα που θα προβάλει τις

εγγραφές του πίνακα μια κάθε φορά και αργότερα θα αποκτήσει την ικανότητα να τις αλλάζει κιόλας. Η διαφορά σε αυτό το πα-

ράδειγμα είναι ότι όλα θα γίνονται με κώδικα που θα γράψουμε εμείς γραμμή-γραμμή. Όχι στα ετοιματζίδικα!

13

Μπορεί να αναρωτηθείτε, τι χρειάζεται ο έλεγχος αν τα νόμιμα δεδομένα που ήρθαν από τη ΒΔ στη φόρμα δεν άλλαξαν; Δεν

παραμένουν αγνά και συνεπή με τους κανόνες της ΒΔ;

Η απάντηση είναι όχι, διότι μπορεί στο μεσοδιάστημα τα υπόλοιπα περιεχόμενα της ΒΔ να έχουν αλλάξει, καθιστώντας τη συνο-

λική κατάσταση της ΒΔ παράνομη. Αλλά ακόμα και αν δεν αλλάξει η υπόλοιπη ΒΔ, ασυνέπεια μπορεί να παρουσιαστεί επειδή η

ίδια εγγραφή άλλαξε από άλλους ταυτόχρονους χρήστες! Αυτό είναι ένα μεγάαααααλο θέμα στις ΒΔ που ονομάζεται έλεγχος

ταυτοχρονισμού (concurrency control).

Εικόνα 35 Σχεδίαση του πίνακα tblMovies για τις ταινίες της συλλογής μου

Page 21: Σημειώσεις για βάσεις δεδομένων Client Server

Τεχνικός Εφαρμογών Πληροφορικής Γλώσσα Προγραμματισμού V IEK ΣΥΡΟΥ 2013

[email protected] 27-Μαϊ-14 Σελ. 21

7.2 Σύνδεση με τη ΒΔ

Ας προσθέσουμε μια νέα, κενή φόρμα και την ονομάζουμε frmMovies. Εδώ μπορεί να μπείτε στον πειρασμό να δημιουργήσετε

ένα DataSet με τον πίνακα και έπειτα να το σύρετε πάνω στη φόρμα, φτιάχνοντας λεζάντες, πεδία, και μπάρα πλοήγησης αυτόμα-

τα, αλλά δείξτε αυτοσυγκράτηση.

Με διπλό κλικ πάνω στην φόρμα

frmMovies, ανοίξτε τον κώδικά της

που είναι στην ομώνυμη κλάση. Θα

πληκτρολογήσετε σταδιακά τον κώ-

δικα που φαίνεται στο Πρόγραμμα 7.

Ας ξεκινήσουμε σιγά-σιγά.

Καταρχάς πρέπει να δηλώσουμε με

την εντολή Imports ότι θα συνδεθού-

με με μια ΒΔ του SQL Server. Αντί-

στοιχη βιβλιοθήκη θα δηλώναμε για

σύνδεση με την Access, την Oracle,

τη MySQL. Οι δηλώσεις βιβλιοθη-

κών Imports γίνονται έξω από το

σώμα της κλάσης.

Μέσα στο σώμα της κλάσης της

φόρμας frmMovies δηλώνουμε μια

μεταβλητή conn για το αντικείμενο

της σύνδεσης. Η σύνδεση ανοίγει με τη μέθοδο .Open(), αφού έχει καθοριστεί η συμβολοσειρά σύνδεσης που ορίζει σε ποιο μη-

χάνημα τρέχει ο εξυπηρετητής της ΒΔ και πώς τον λένε, το πλήρες όνομα του αρχείου της ΒΔ, μεταξύ άλλων.

Ο προσεκτικός αναγνώστης θα θυμηθεί την κουβέντα που κάναμε στην ενότητα 6.1 για την έγερση εξαιρέσεων από τον εξυπηρε-

τητή και θα περικλείσει την «επικίνδυνη» μέθοδο .Open() σε μια Try…Catch, όπως στον κώδικα στην Εικόνα 33.

7.3 Προετοιμασία και μεταφορά δεδομένων από τη ΒΔ στη φόρμα

Τώρα πρέπει να στήσουμε την απαραίτητη υποδομή που θα φιλοξενήσει τα δεδομένα του πίνακα της ΒΔ στο περιβάλλον του

πελάτη, δηλαδή της VB. Γι αυτό

χρειάζονται τρία αντικείμενα που

τα δηλώνουμε στο τμήμα δηλώ-

σεων της κλάσης (γραμμές 3-5

στο Πρόγραμμα 8). Συμπληρώ-

στε τις άσπρες γραμμές εντάσσο-

ντάς τις ανάμεσα στις υπάρχου-

σες που σημειώνονται με σκούρο

φόντο.

Δεν θα εξηγήσω εδώ τι κάνουν

αυτά τα αντικείμενα, γιατί ούτε

κι εγώ ξέρω ακριβώς. Το μόνο

αντικείμενο που θα χρησιμοποι-

ήσουμε είναι ο πίνακας δεδομέ-

νων datTbl που είναι ο χώρος στη

μνήμη που θα φυλαχτούν οι εγ-

γραφές του πίνακα της ΒΔ14

.

Παρατηρήστε τη SQL διαταγή SELECT στη γραμμή 9 που ανασύρει τα δεδομένα από τη ΒΔ. Εκεί μπορείτε να κάνετε διάφορες

παραλλαγές:

Να προσθέσετε ORDER BY Titlos που θα ταξινομήσει τις ταινίες κατά τον τίτλο τους προτού τις φυλάξει στον πίνακα δε-

δομένων.

Αν υποψιάζεστε ότι οι εγγραφές είναι πολλές, πχ εκατομμύρια, τότε μπορείτε να γράψετε

SELECT TOP 1000 * FROM tblMovies ORDER BY ImdbKod

και θα φέρει τις 1000 πρώτες με τους μικρότερους κωδικούς.

Σε εφαρμογές που ο όγκος των δεδομένων είναι μεγάλος, οι προσεκτικοί επαγγελματίες προγραμματιστές προτάσσουν ένα παρά-

θυρο διαλόγου που ζητά από το χρήστη να επιλέξει μία ή μερικές εγγραφές και φέρνουν μόνον αυτές. Έτσι γλιτώνουν τσάμπα

κουβάλημα χιλιάδων δεδομένων που επιβαρύνει τον εξυπηρετητή της ΒΔ, μποτιλιάρει το δίκτυο και γεμίζει τη μνήμη του πελά-

τη.

Ακόμα και τώρα όμως δεν έχουμε καταφέρει να δούμε δεδομένα πάνω στη φόρμα. Ίσως ήδη να αναπολείτε τους μάγους των

προηγούμενων ενοτήτων…

14

Κάνω ξεκάθαρη τη διάκριση: Πίνακας (table) → ΒΔ → δίσκος. Πίνακας δεδομένων (data table) → πελάτης = εφαρμογή →

μνήμη RAM

Imports System.Data.SqlClient 'παροχέας δεδομένων για SQL Server 'για την Access θα ήταν .OleDb Public Class frmMovies Private conn As New SqlConnection 'σύνδεση με τη ΒΔ Private Sub frmMovies_Load(ByVal sender As System.Object, … conn.ConnectionString = "Data Source=.\SQLEXPRESS;" & _ "AttachDbFilename=D:\MovieDb.mdf;" & _ "Integrated Security=True;" & _ "User Instance=True" conn.Open() 'ανοίγει τη σύνδεση End Sub End Class

Πρόγραμμα 7 Σύνδεση πελάτη με τη ΒΔ

1 … 2 Private conn As New SqlConnection 'σύνδεση με τη ΒΔ 3 Private datAdp As New SqlDataAdapter 4 Private cmdBld As New SqlCommandBuilder 5 Private datTbl As New DataTable 'ο πίνακας στη μνήμη της εφαρμογής 6 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As … 7 … 8 conn.Open() 'ανοίγει τη σύνδεση 9 datAdp = New SqlDataAdapter("SELECT * FROM tblMovies", conn)

10 cmdBld = New SqlCommandBuilder(datAdp) 11 datAdp.Fill(datTbl) 'φέρνει τα δεδομένα του πίνακα στην εφαρμογή 12 End Sub 13 …

Πρόγραμμα 8 Προετοιμασία και μεταφορά από ΒΔ σε πελάτη

Page 22: Σημειώσεις για βάσεις δεδομένων Client Server

IEK ΣΥΡΟΥ 2013 Γλώσσα Προγραμματισμού V Τεχνικός Εφαρμογών Πληροφορικής

Σελ. 22 27-Μαϊ-14 [email protected]

7.4 Προβολή δεδομένων στη φόρμα

Τώρα θα σχεδιάσουμε τη φόρμα τοποθετώντας τα απαραίτη-

τα χειριστήρια. Γυρίζουμε λοιπόν στη σχεδίαση της φόρμας,

αφήνοντας προσωρινά τον κώδικά της. Φτιάχνουμε τις ετικέ-

τες (Label) και τα πλαίσια (TextBox, CheckBox,

DateTimePicker), όπως περίπου φαίνονται στην Εικόνα 36.

Μη δώσετε πολλή σημασία στην εμφάνιση, όσο στα ονόματα

των χειριστηρίων. Κατά τα ειωθότα, προτείνω να τα ονομά-

σετε δίνοντάς τους το ουγγρικό πρόθεμα που έχει ο Πίνακας

2 για κάθε τύπο χειριστηρίου, ακολουθούμενο από το όνομα

του πεδίου του πίνακα. Έτσι το πρώτο πλαίσιο κειμένου ο-

νομάζεται txtImdbKod και το τελευταίο CheckBox ονομάζε-

ται chkExoDei.

Ξαναγυρνάμε στον κώδικα.

Τα στοιχεία των κινηματογραφικών ταινιών τα αφήσαμε από

την προηγούμενη παράγραφο στον πίνακα δεδομένων datTbl

που είναι οργανωμένος σε γραμ-

μές (συλλογή datTbl.Rows). Ένα

χρήσιμο στοιχείο του πίνακα

δεδομένων είναι το πλήθος των

γραμμών του, ιδιότητα

datTbl.Rows.Count, που αντι-

στοιχεί στο πλήθος των εγγρα-

φών του πίνακα. Προτού να επι-

χειρήσουμε να προβάλουμε πά-

νω στη φόρμα μια ταινία, πρέπει

να βεβαιωθούμε ότι υπάρχει

τουλάχιστον μία. Αυτό γίνεται

στη γραμμή 7 στο Πρόγραμμα 9.

Θα προσθέσουμε μια μεταβλητή

κλάσης intTrexousaGram

(γραμμή 3) που θα θυμάται σε

ποια γραμμή βρισκόμαστε. Με

τη φόρτωση της φόρμας βρισκό-

μαστε στη γραμμή 0 (εφόσον

υπάρχει τουλάχιστον μία γραμ-

μή).

Για να δείξουμε τις τιμές των

πεδίων μιας εγγραφής (πιο σω-

στά γραμμής) του πίνακα δεδο-

μένων φτιάξαμε μια υπορουτίνα

DeixeGrammh, επειδή θα την

χρησιμοποιήσουμε αρκετές φο-

ρές. Αυτή ανασύρει από τον πίνακα δεδομένων την γραμμή που αντιστοιχεί στην τιμή της μεταβλητής intTrexousaGram. Την

φυλάει σε μια προσωρινή μεταβλητή datGram και τσιμπάει τις τιμές από κάθε πεδίο και τις ακουμπάει στο ομώνυμο χειριστήριο

της φόρμας. Την μέθοδο .ToString τη βάζουμε για να μετατρέψουμε τις Null τιμές σε κενές συμβολοσειρές – προσπεράστε το.

Προς το παρόν για να πάρουμε χαρά ότι προβάλαμε την πρώτη εγγραφή, συμπληρώστε στον κώδικα τη γραμμή 9 που καλεί την

υπορουτίνα. Θρίαμβος!

7.5 Μετακίνηση στις εγγραφές

Ναι, δείξαμε την πρώτη εγγραφή, αλλά ο κώδικάς μας δεν

κάνει τίποτα άλλο. Τώρα θα προσθέσουμε τη δυνατότητα

να μετακινούμαστε μπρος-πίσω στις γραμμές.

Βάζουμε στη φόρμα δυο κουμπιά με λεζάντες

'Προηγούμενο' και 'Επόμενο' και τα ονομάζουμε btnPrin

και btnMeta. Με διπλό κλικ πάνω σε καθένα ανοίγει ο

σκελετός του κώδικα για το συμβάν Click και εκεί μέσα

συμπληρώνουμε τον κώδικα που φαίνεται στο Πρόγραμμα

10. Δεν είναι και τίποτα σπουδαίο, απλή κλήση στην υπο-

ρουτίνα DeixeGrammh, αφού έχουμε ενημερώσει (μειώσει

ή αυξήσει κατά ένα) τη μεταβλητή για την τρέχουσα

γραμμή.

Εικόνα 36 Χειριστήρια της φόρμας

1 … 2 Private datTbl As New DataTable 'ο πίνακας στη μνήμη της εφαρμογής 3 Private intTrexousaGram As Integer 'τρέχουσα γραμμή στη φόρμα 4 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As … 5 … 6 datAdp.Fill(datTbl) 'φέρνει τα δεδομένα του πίνακα στην εφαρμογή 7 If datTbl.Rows.Count > 0 Then 'αν υπάρχει τουλάχιστον μια γραμμή 8 intTrexousaGram = 0 'όρισε ως τρέχουσα την πρώτη γραμμή 9 DeixeGrammh() 'δείξε την πρώτη γραμμή

10 End If 11 End Sub

12 Private Sub DeixeGrammh() 13 'προβάλει στη φόρμα τα δεδομένα της τρέχουσας γραμμής 14 'ανάκληση της γραμμής από τον πίνακα δεδομένων 15 Dim datGram As DataRow = datTbl.Rows(intTrexousaGram) 16 txtImdbKod.Text = datGram("ImdbKod").ToString 17 txtTitlos.Text = datGram("Titlos").ToString 18 dtpHmKyklof.Text = datGram("HmKyklof").ToString 19 txtEispraxeis.Text = datGram("Eispraxeis") 20 txtSkinothetis.Text = datGram("Skinothetis").ToString 21 chkExoDei.Checked = datGram("ExoDei") 22 End Sub 23 …

Πρόγραμμα 9 Προβολή εγγραφής στη φόρμα

… Private Sub btnPrin_Click(ByVal sender … If intTrexousaGram > 0 Then intTrexousaGram = intTrexousaGram - 1 DeixeGrammh() End If End Sub Private Sub btnMeta_Click(ByVal sender … If intTrexousaGram < datTbl.Rows.Count - 1 Then intTrexousaGram = intTrexousaGram + 1 DeixeGrammh() End If End Sub …

Πρόγραμμα 10 Μετακίνηση στις εγγραφές

Page 23: Σημειώσεις για βάσεις δεδομένων Client Server

Τεχνικός Εφαρμογών Πληροφορικής Γλώσσα Προγραμματισμού V IEK ΣΥΡΟΥ 2013

[email protected] 27-Μαϊ-14 Σελ. 23

Εκεί που χρειάζεται προσοχή είναι όταν φτάνουμε στα όρια του πίνακα δεδομένων. Θέλουμε όταν πατιέται το 'Προηγούμενο' και

τρέχουσα εγγραφή είναι η πρώτη, να μην κάνει τίποτα, ομοίως και όταν πατιέται το 'Επόμενο' και βρίσκεται στην τελευταία εγ-

γραφή.

Δυστυχώς η αρίθμηση των γραμμών στον πίνακα δεδομένων ακολουθεί τα χούγια της C, δηλαδή ξεκινάει από το μηδέν, και όχι

της Basic, οπότε θα ξεκινούσε από το ένα. Αν υποθέσουμε ότι έχουμε τρεις ταινίες στη συλλογή μας, η πρώτη γραμμή έχει αριθ-

μό 0, η δεύτερη 1, και η τελευταία 2. Αυτή η σπαστική λεπτομέρεια θέλει προσοχή όταν μετακινούμαστε στις εγγραφές, γι αυτό

μελετήστε τις If που κάνουν τον έλεγχο ορίων.

Άσκηση για εξάσκηση: Φτιάξτε κώδικα που όταν διπλοπατάς το κουμπί 'Προηγούμενο' να οδηγεί στην πρώτη γραμμή

και, αντίστοιχα, όταν διπλοπατάς το 'Επόμενο' να οδηγεί στην τελευταία.

Μετά υλοποιήστε δυνατότητα να πληκτρολογεί ο χρήστης έναν αριθμό και να προβάλλεται η γραμμή αυτή, όπως δου-

λεύει στην Access.

7.6 Τροποποίηση δεδομένων

Έχουμε να φτιάξουμε τρία κουμπιά για να αποθηκεύσουμε τις αλλαγές που έχουμε κάνει σε μια υπάρχουσα γραμμή, να προσθέ-

σουμε μια νέα εγγραφή

και να διαγράψουμε μια

υπάρχουσα.

Ας μελετήσουμε τον

κώδικα που εκτελείται

πίσω από κάθε κουμπί

όπως φαίνεται στο Πρό-

γραμμα 11.

Αποθήκευση Η γραμμή 2 εξασφαλί-

ζει ότι είμαστε πάνω σε

μια γραμμή, άρα υπάρ-

χει κάτι να αποθηκευτεί.

Θυμηθείτε ότι αν ο πί-

νακας είναι άδειος, η

φόρμα ανοίγει, αλλά δεν

έχει κάποια εγγραφή να

δείξει, άρα ούτε και να

αποθηκεύσει.

Οι γραμμές 5-9 παίρ-

νουν τα περιεχόμενα

των χειριστηρίων της

φόρμας και τα τοποθε-

τούν στις κατάλληλες

θέσεις της τρέχουσας

γραμμής του πίνακα

δεδομένων. Παίρνουν

ακόμα και εκείνα που

δεν έχουν αλλαχτεί,

αλλά δεν πειράζει.

Η αποθήκευση στη ΒΔ

γίνεται στην γραμμή 10.

Για δοκιμάστε να βάλε-

τε αρνητικές εισπράξεις

ή όνομα σκηνοθέτη

πάνω από το προβλεπό-

μενο μήκος. Θα σας

πετάξει απέξω γιατί

παραβιάζετε τους κανόνες της ΒΔ. Αν είστε προσεκτικοί, θα θέλατε να περικλείσετε τη γραμμή της αποθήκευσης με κώδικα χει-

ρισμού εξαιρέσεων για σφάλματα δεδομένων, όπως αυτός που φτιάξαμε στην ενότητα 6.2.

Νέα εγγραφή Πρώτα προσθέτω νέα γραμμή στον πίνακα δεδομένων και επειδή αυτή εισάγεται στο τέλος, μετακινούμαι στην τελευταία γραμ-

μή. Έπειτα τοποθετώ εξ ορισμού τιμές (default values) στα πεδία που επιθυμώ (γραμμές 17-18). Τέλος προβάλω τη νέα κενή

γραμμή για να πάει ο χρήστης να εισάγει τιμές στα πεδία. Όταν ολοκληρώσει ο πολυχρονεμένος, πρέπει να πατήσει ‘Αποθήκευ-

ση’ για να σωθεί η νέα γραμμή στη ΒΔ.

Διαγραφή Αρχικά ελέγχουμε ότι είμαστε πάνω σε κάποια εγγραφή. Και εδώ η δουλειά γίνεται σε δυο βήματα: πρώτα διαγράφεται η γραμμή

από τον πίνακα δεδομένων (γραμμή 24) και μετά ενημερώνεται αρμοδίως ο πίνακας της ΒΔ (γραμμή 25).

'Τροποποίηση δεδομένων ----------------------------------------------------- 1 Private Sub btnSose_Click(ByVal sender As System.Object, ByVal e As … 2 If intTrexousaGram <> -1 Then 'αν υπάρχει τρέχουσα γραμμή 3 'Αποθηκεύει τα πεδία στην τρέχουσα γραμμή του πίνακα δεδομένων 4 datTbl.Rows(intTrexousaGram)("ImdbKod") = txtImdbKod.Text 5 datTbl.Rows(intTrexousaGram)("Titlos") = txtTitlos.Text 6 datTbl.Rows(intTrexousaGram)("HmKyklof") = dtpHmKyklof.Text 7 datTbl.Rows(intTrexousaGram)("Eispraxeis") = txtEispraxeis.Text 8 datTbl.Rows(intTrexousaGram)("Skinothetis") = txtSkinothetis.Text 9 datTbl.Rows(intTrexousaGram)("ExoDei") = chkExoDei.Checked

10 datAdp.Update(datTbl) 'ενημερώνει τον πίνακα της ΒΔ 11 End If 12 End Sub

13 Private Sub btnNeo_Click(ByVal sender As System.Object, ByVal e As … 14 Dim neaGram As DataRow = datTbl.NewRow() 15 datTbl.Rows.Add(neaGram) 'προσθέτει νέα γραμμή στον πίνακα δεδομένων 16 intTrexousaGram = datTbl.Rows.Count - 1 'πηγαίνει στην τελευταία γραμμή 17 neaGram("Eispraxeis") = 0.0 'εξ ορισμού τιμή 18 neaGram("ExoDei") = False 'εξ ορισμού τιμή 19 DeixeGrammh() 'που είναι η κενή 20 'ΠΡΟΣΟΧΗ: δεν την αποθηκεύει, πρέπει να πατήσεις 'Αποθήκευση' 21 End Sub

22 Private Sub btnDiagrafi_Click(ByVal sender As System.Object, ByVal e As … 23 If intTrexousaGram <> -1 Then 'αν υπάρχει τρέχουσα γραμμή 24 datTbl.Rows(intTrexousaGram).Delete() 'σβήστηνε 25 datAdp.Update(datTbl) 'ενημέρωσε τη ΒΔ 26 If datTbl.Rows.Count > 0 Then 'αν υπάρχει τουλάχιστον μια γραμμή 27 intTrexousaGram = 0 'η φόρμα θα δείχνει την πρώτη γραμμή 28 Else 29 intTrexousaGram = -1 'δεν υπάρχει καμιά γραμμή 30 End If 31 DeixeGrammh() 32 End If 33 End Sub

Πρόγραμμα 11 Τροποποίηση εγγραφών

Page 24: Σημειώσεις για βάσεις δεδομένων Client Server

IEK ΣΥΡΟΥ 2013 Γλώσσα Προγραμματισμού V Τεχνικός Εφαρμογών Πληροφορικής

Σελ. 24 27-Μαϊ-14 [email protected]

7.7 Ανασκόπηση του έργου

Ακολουθεί όλος ο κώδικας VB της φόρμας για να τον έχετε ως αναφορά. Είναι δυο σελίδες, αλλά μη μασάτε. Περιλαμβάνει μι-

κροβελτιώσεις σε σχέση με τον κώδικα των προηγούμενων παραγράφων της ενότητας, κυρίως διακοσμητικές. Ανακαλύψτε τις!

Imports System.Data.SqlClient 'παροχέας δεδομένων για SQL Server 'για την Access θα ήταν .OleDb Public Class frmMovies 'Δηλώσεις κλάσης ------------------------------------------------------------ Private conn As New SqlConnection 'σύνδεση με τη ΒΔ Private datAdp As New SqlDataAdapter Private cmdBld As New SqlCommandBuilder Private datTbl As New DataTable 'ο πίνακας στη μνήμη της εφαρμογής Private intTrexousaGram As Integer 'τρέχουσα γραμμή που προβάλλεται στη φόρμα 'Σύνδεση και αρχικοποίηση --------------------------------------------------- Private Sub frmMovies_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load conn.ConnectionString = "Data Source=.\SQLEXPRESS;" & _ "AttachDbFilename=D:\My Documents\MovieDb.mdf;" & _ "Integrated Security=True;" & _ "User Instance=True" Try conn.Open() 'ανοίγει τη σύνδεση - επικίνδυνο για αποτυχία Catch ex As SqlException MessageBox.Show("Σφάλμα " & ex.Number & " " & ex.Message & vbCrLf & _ "Αντε να εκκινησεις τον SQLEXPRESS από Υπηρεσίες.") Application.Exit() End Try datAdp = New SqlDataAdapter("SELECT * FROM tblMovies ORDER BY Titlos", conn) cmdBld = New SqlCommandBuilder(datAdp) datAdp.Fill(datTbl) 'φέρνει τα δεδομένα του πίνακα στην εφαρμογή If datTbl.Rows.Count > 0 Then 'αν υπάρχει τουλάχιστον μια γραμμή intTrexousaGram = 0 'κάνε τρέχουσα την πρώτη γραμμή Else intTrexousaGram = -1 'δεν υπάρχει καμιά γραμμή End If DeixeGrammh() 'δείξε την τρέχουσα γραμμή End Sub Private Sub frmMovies_FormClosed(ByVal sender As Object, ByVal e As Sys-tem.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed conn.Close() End Sub 'Προβολή μιας γραμμής ------------------------------------------------------- Private Sub DeixeGrammh() 'προβάλει στη φόρμα τα δεδομένα τρέχουσας γραμμής If intTrexousaGram <> -1 Then 'αν υπάρχει τρέχουσα γραμμή Dim datGram As DataRow = datTbl.Rows(intTrexousaGram) 'ανάκληση txtImdbKod.Text = datGram("ImdbKod").ToString 'προβολή των πεδίων της txtTitlos.Text = datGram("Titlos").ToString dtpHmKyklof.Text = datGram("HmKyklof").ToString txtEispraxeis.Text = FormatCurrency(datGram("Eispraxeis")) 'νόμισμα txtSkinothetis.Text = datGram("Skinothetis").ToString chkExoDei.Checked = datGram("ExoDei") Else txtImdbKod.Text = "" txtTitlos.Text = "" dtpHmKyklof.Text = "" txtEispraxeis.Text = "" txtSkinothetis.Text = "" chkExoDei.Checked = False

Page 25: Σημειώσεις για βάσεις δεδομένων Client Server

Τεχνικός Εφαρμογών Πληροφορικής Γλώσσα Προγραμματισμού V IEK ΣΥΡΟΥ 2013

[email protected] 27-Μαϊ-14 Σελ. 25

End If 'δείξε την τρέχουσα και το πλήθος lblPlithos.Text = intTrexousaGram + 1 & "/" & datTbl.Rows.Count End Sub 'Μετακίνηση στις γραμμές ------------------------------------------------------ Private Sub btnPrin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn Prin.Click If intTrexousaGram > 0 Then 'αν είσαι μετά την πρώτη ή δεν υπάρχει καμιά intTrexousaGram = intTrexousaGram - 1 DeixeGrammh() End If End Sub Private Sub btnMeta_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMeta.Click If intTrexousaGram < datTbl.Rows.Count - 1 Then 'αν είσαι πριν την τελευταία intTrexousaGram = intTrexousaGram + 1 DeixeGrammh() End If End Sub 'Τροποποίηση δεδομένων -------------------------------------------------------- Private Sub btnSose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSose.Click If intTrexousaGram <> -1 Then 'αν υπάρχει τρέχουσα γραμμή 'Αποθηκεύει τα πεδία στην τρέχουσα γραμμή του πίνακα δεδομένων datTbl.Rows(intTrexousaGram)("ImdbKod") = txtImdbKod.Text datTbl.Rows(intTrexousaGram)("Titlos") = txtTitlos.Text datTbl.Rows(intTrexousaGram)("HmKyklof") = dtpHmKyklof.Text datTbl.Rows(intTrexousaGram)("Eispraxeis") = CDbl(txtEispraxeis.Text) 'επαναφορά datTbl.Rows(intTrexousaGram)("Skinothetis") = txtSkinothetis.Text datTbl.Rows(intTrexousaGram)("ExoDei") = chkExoDei.Checked Try datAdp.Update(datTbl) 'ενημερώνει τον πίνακα της ΒΔ Catch ex As SqlException MessageBox.Show("Σφάλμα: " & ex.Message, "Σφάλμα δεδομένων", _ MessageBoxButtons.OK, MessageBoxIcon.Exclamation) End Try End If End Sub Private Sub btnNeo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNeo.Click Dim neaGram As DataRow = datTbl.NewRow() datTbl.Rows.Add(neaGram) 'προσθέτει νέα γραμμή στον πίνακα δεδομένων intTrexousaGram = datTbl.Rows.Count - 1 'μετακινείται στην τελευταία γραμμή neaGram("Eispraxeis") = 0.0 'εξ ορισμού τιμή neaGram("ExoDei") = False 'εξ ορισμού τιμή DeixeGrammh() 'που είναι η κενή 'ΠΡΟΣΟΧΗ: δεν την αποθηκεύει, πρέπει να πατήσεις 'Αποθήκευση' End Sub Private Sub btnDiagrafi_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDiagrafi.Click If intTrexousaGram <> -1 Then 'αν υπάρχει τρέχουσα γραμμή datTbl.Rows(intTrexousaGram).Delete() 'σβήστηνε datAdp.Update(datTbl) 'ενημέρωσε τη ΒΔ If datTbl.Rows.Count > 0 Then 'αν υπάρχει τουλάχιστον μια γραμμή intTrexousaGram = 0 'κάνε τρέχουσα την πρώτη γραμμή Else intTrexousaGram = -1 'δεν υπάρχει καμιά γραμμή End If DeixeGrammh() 'δείξε την τρέχουσα γραμμή End If End Sub End Class

Page 26: Σημειώσεις για βάσεις δεδομένων Client Server

IEK ΣΥΡΟΥ 2013 Γλώσσα Προγραμματισμού V Τεχνικός Εφαρμογών Πληροφορικής

Σελ. 26 27-Μαϊ-14 [email protected]

Φόρμα δεδομένων Να και η σχεδίαση της φόρμας με τα χειριστήρια:

Δημιουργία της ΒΔ Να και ο SQL κώδικας με τις εντολές DDL για τη δημιουργία της ΒΔ:

USE [D:\MY DOCUMENTS\MOVIEDB.MDF]

GO

CREATE TABLE [dbo].[tblMovies] (

[ImdbKod] [int] NOT NULL,

[Titlos] [nvarchar](50) NOT NULL,

[HmKyklof] [date] NOT NULL,

[Eispraxeis] [money] NULL,

[Skinothetis] [nvarchar](50) NULL,

[ExoDei] [bit] NOT NULL,

CONSTRAINT [PK_tblMovies] PRIMARY KEY (

[ImdbKod] ASC

)

WITH (ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)

ON [PRIMARY]

)

ON [PRIMARY]

GO

ALTER TABLE [dbo].[tblMovies] WITH CHECK ADD CONSTRAINT [CK_tblMoviesEispraxeis]

CHECK ([Eispraxeis] >= 0.0)

GO

Τέλος επισυνάπτω ζιπαρισμένο το VB2010 project. Άμα το ξεζιπάρετε σε ένα φάκελο και φτιάξετε και τη ΒΔ με τις παραπάνω

εντολές ή ακολουθώντας τις οδηγίες της ενότητας 7.1, μπορείτε να το εκτελέσετε. Αρκεί να δηλώσετε στο ConnectionString το

όνομα του database server και τη σωστή θέση του αρχείου της ΒΔ, όπως φαίνεται στο Πρόγραμμα 7.

Page 27: Σημειώσεις για βάσεις δεδομένων Client Server

Τεχνικός Εφαρμογών Πληροφορικής Γλώσσα Προγραμματισμού V IEK ΣΥΡΟΥ 2013

[email protected] 27-Μαϊ-14 Σελ. 27

8. Ευρετήριο όρων Aποσυνδεδεμένη αρχιτεκτονική ........................................ 10

Αντικειμενοστραφής γλώσσα .............................................. 4

Αποσφαλμάτωση ................................................................. 8

Έγερση εξαίρεσης .............................................................. 18

Έλεγχος ταυτοχρονισμού ................................................... 20

Ευρετήριο .......................................................................... 13

Ιδεατή μηχανή ...................................................................... 4

Ιδιότητα αντικειμένου .......................................................... 4

Κύρια-δευτερεύουσα φόρμα .............................................. 15

Μοντέλο εξυπηρετητή αρχείων ........................................... 2

Οπτικός προγραμματισμός ................................................... 4

Πεδίo αναζήτησης .............................................................. 14

Προστακτικός προγραμματισμός ......................................... 4

Πρωτόκολλο προσπέλασης δεδομένων ............................... 3

Σημείο διακοπής .................................................................. 8

Συμβάν ................................................................................. 4

Συνδεδεμένοι πίνακες .......................................................... 2

Χειρισμός εξαίρεσης .......................................................... 18

Χειριστήριο .......................................................................... 4

9. Πίνακας περιεχομένων

1. Εισαγωγή ............................................................................................................................................................................ 1

1.1 Μοντέλο εξυπηρετητή αρχείων .......................................................................................................................................... 1

1.2 ΒΔ για πωλήσεις .................................................................................................................................................................. 2

1.3 Μοντέλο πελάτη/εξυπηρετητή ........................................................................................................................................... 3

2. Οπτικός προγραμματισμός ................................................................................................................................................. 4

2.1 Βασικές έννοιες του οπτικού προγραμματισμού ................................................................................................................ 4

2.2 Δυο κουβέντες για τη Visual Basic ...................................................................................................................................... 4

2.3 Χαιρετίσματα ...................................................................................................................................................................... 5 Κώδικας πίσω από τη φόρμα...................................................................................................................................................... 6

2.4 Αμοιβή με τη λέξη ............................................................................................................................................................... 7

3. Δεδομένα από την Access ................................................................................................................................................... 9

3.1 Δεδομένα σε πλέγμα ........................................................................................................................................................... 9 Το παρασκήνιο .......................................................................................................................................................................... 10 Προσαρμογή του πλέγματος .................................................................................................................................................... 11

3.2 Μια εγγραφή στη φόρμα .................................................................................................................................................. 11

4. Δεδομένα από τον SQL Server .......................................................................................................................................... 12

Σχεδίαση της ΒΔ ........................................................................................................................................................................ 12 Δημιουργία DataSet .................................................................................................................................................................. 13

4.1 Φόρμα πλέγματος ............................................................................................................................................................. 13

4.2 Αναλυτική φόρμα με πεδία αναζήτησης .......................................................................................................................... 13

4.3 Πεδίο αναζήτησης ............................................................................................................................................................. 14

4.4 Κύρια-δευτερεύουσα φόρμα ............................................................................................................................................ 15

5. Αναζήτηση ........................................................................................................................................................................ 16

Ορισμός ερωτήματος φιλτραρίσματος ..................................................................................................................................... 16 Εκτέλεση από τη φόρμα ........................................................................................................................................................... 16

5.1 Φίλτρο σε ξένο πίνακα ...................................................................................................................................................... 17

6. Εξαιρέσεις......................................................................................................................................................................... 18

6.1 Σύνδεση με τη ΒΔ .............................................................................................................................................................. 18

6.2 Έλεγχος δεδομένων........................................................................................................................................................... 19

Page 28: Σημειώσεις για βάσεις δεδομένων Client Server

IEK ΣΥΡΟΥ 2013 Γλώσσα Προγραμματισμού V Τεχνικός Εφαρμογών Πληροφορικής

Σελ. 28 27-Μαϊ-14 [email protected]

7. Προγραμματισμός χωρίς μάγια ........................................................................................................................................ 20

7.1 Η ΒΔ MovieDb ................................................................................................................................................................... 20

7.2 Σύνδεση με τη ΒΔ .............................................................................................................................................................. 21

7.3 Προετοιμασία και μεταφορά δεδομένων από τη ΒΔ στη φόρμα ..................................................................................... 21

7.4 Προβολή δεδομένων στη φόρμα ...................................................................................................................................... 22

7.5 Μετακίνηση στις εγγραφές ............................................................................................................................................... 22

7.6 Τροποποίηση δεδομένων ................................................................................................................................................. 23 Αποθήκευση ............................................................................................................................................................................. 23 Νέα εγγραφή ............................................................................................................................................................................ 23 Διαγραφή .................................................................................................................................................................................. 23

7.7 Ανασκόπηση του έργου .................................................................................................................................................... 24

8. Ευρετήριο όρων ................................................................................................................................................................ 27

9. Πίνακας περιεχομένων ..................................................................................................................................................... 27