How to run aspnet_regsql on Azure SQL database

Δημοσιεύτηκε στις Τετάρτη, 22 Μαΐου 2013 9:41 πμ από το μέλος dpant :: 0 σχόλια
Καταχώρηση στις κατηγορίες: ,

One of the first things you may find yourself wondering about when creating an Azure SQL database is how to have ASPNETDB installed in. If you try to use aspnet_regsql you will be frustrated by the error:

Setup failed. Exception: An error occurred during the execution of the SQL file 'InstallCommon.sql'. The SQL error number is 40508 and the SqlException message is: USE statement is not supported to switch between databases. Use a new connection to connect to a different Database.

which means SQL Azure simply does not support the USE statement, really.

Fortunately, Microsoft has created a hotfix to work around this problem. Download and extract the contents of aspnet_regsqlazure.zip then open a command prompt and navigate to the folder where you extracted the files. Enter the following command to have the job done:

aspnet_regsqlazure -s [your server name].database.windows.net -d [your database name] -u [your user name]@[your server name] -p [your password] -a mr

 

How to programmatically set the connection string when the DBML is in a library project

Δημοσιεύτηκε στις Σάββατο, 18 Μαΐου 2013 8:47 μμ από το μέλος dpant :: 0 σχόλια
Καταχώρηση στις κατηγορίες: , , , , ,

In my previous post I wrote about using Linq-to-Sql and the Repository pattern. Typically, this means the dbml file is located in a repository project, which is a separate library project. In other words, the dbml files does not have direct access to the web.config connection strings of your web (presentation) project. The dbml designer is configured using the app.config settings, instead.

On the other hand, the web.config debug/release build mechanism is too handy to ignore when it comes to connection strings. So, can the dbml be programmatically configured to use the appropriate web.config's connection string and if yes, how?

The answer lies in the connection string passed as a parameter to the DataContext constructor thus overriding the dbml designer's property. This becomes even easier when using the Repository pattern since there is a single point of construction: the Repository class constructor. The following code snipet demonstrates the solution discussed. Please note, that the presented abstract Repository class is to be as base to all other type-specific repository classes.

public abstract class Repository<T> where T : class
{

protected VioDataContext dataContext;

public Repository()
{

dataContext = new DataContext(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);

}

}

LINQ-to-SQL και αρχιτεκτονική ASP.NET εφαρμογών

Δημοσιεύτηκε στις Σάββατο, 26 Ιανουαρίου 2013 5:01 μμ από το μέλος dpant :: 1 σχόλια
Καταχώρηση στις κατηγορίες: , , ,

Εκτός και αν πρόκειται για sample, prototype ή throw-away project τότε η αρχιτεκτονική μιας ASP.NET εφαρμογής είναι αυτή που φαίνεται στο παρακάτω σχήμα.

aspnet design architecture

Τα επίπεδα (layers) μπορούν να διαμορφωθούν ανάλογα με το μέγεθος της εφαρμογής. Για παράδειγμα, πιθανόν να υπάρχει χωριστό presentation layer (ανάμεσα στα Services και το UI) αρκεί η σχεδίαση να μην αποτελεί overkill για την κλίματα του έργου.

Τα παραπάνω ακούγονται πολύ ωραία και ταιριάζουν με τις επιταγές της DDD μεθοδολογίας αλλά τι γίνεται όταν για το persistence επιλέγεται η LINQ-to-SQL; Στην συγκεκριμένη περίπτωση όχι μόνο έχουμε ένα ORM που λειτουργεί ως Repository αλλά γεννάται το ερώτημα αν πρέπει να εκμεταλλευτούμε το Object Model που παράγεται αυτόματα. Φαίνεται πως οι partial classes μπορούν να λειτουργήσουν και ως Domain Model.

Για παράδειγμα, αν στο DataContext έχουμε το Customer entity, η εφαρμογή business logic κανόνων μπορεί να γίνει γράφοντας:

   1:  public partial class Customer
   2:  {
   3:      partial void OnValidate(ChangeAction action)
   4:      {
   5:          if (action == ChangeAction.Insert)
   6:          {
   7:              if (string.IsNullOrEmpty(LastName))
   8:                  throw new CustomerInvalidException("Το επώνυμο του πελάτη είναι υποχρεωτικό.");
   9:          }
  10:      }
  11:  }

Πως να χρησιμοποιήσετε το LINQPad

Δημοσιεύτηκε στις Δευτέρα, 21 Ιανουαρίου 2013 9:32 πμ από το μέλος dpant :: 0 σχόλια
Καταχώρηση στις κατηγορίες: ,

Με το LINQPad μπορείτε να συνδεθείτε στη βάση δεδομένων, να εκτελέσετε LINQ queries γράφοντας τα σε lambda ή query syntax, να δείτε τα αντίστοιχα SQL statements  και φυσικά τα αποτελέσματά τους.

Για παράδειγμα, το παρακάτω query φέρνει το πελατολόγιό μας με σειρά συχνότητας επισκέψεων (ο πιο συχνός πελάτης εμφανίζεται πρώτος) και κατόπιν αλφαβητική. Ως πελάτης θεωρείται οποιοσδήποτε μας έχει επισκεφτεί τουλάχιστον μια φορά.

   1:  from c in Customers                  
   2:  where c.Visits.Any(v => v.vid == 2)
   3:  orderby c.Visits.Count descending, c.lastname, c.firstname
   4:  select c

Στο LINQPad δεν υπάρχει “DataContext”. Customers είναι το όνομα του πίνακα της βάσης με την οποία έχουμε συνδεθεί.

Μετά την εκτέλεση του query, το LINQPad μας παρουσιάζει τα αποτελέσματα:

image

Το αντίστοιχο lambda syntax:

image

και το παραγόμενο SQL:

image

 

Εκτός από LINQ queries, στο LINQPad μπορείτε επίσης να εκτελέσετε οποιαδήποτε C#/VB έκφραση, εντολή ή πρόγραμμα καθώς και να δοκιμάσετε regular expressions (τα matches εμφανίζονται στο Results tab).

LINQ Pocket Reference (και LINQPad)

Δημοσιεύτηκε στις Τετάρτη, 16 Ιανουαρίου 2013 8:45 πμ από το μέλος dpant :: 0 σχόλια
Καταχώρηση στις κατηγορίες: , ,
Μιας και η χρονιά ξεκίνησε με παρουσίαση βιβλίου, ενας πολύ καλός οδηγός τσέπης είναι το LINQ Pocket Reference (εκδόσεις O'Reilly).



Ιδιαίτερο ενδιαφέρον έχει το πρώτο μέρος του οδηγού που εξηγεί βασικές έννοιες όπως το deferred execution, iterator chaining και lamda expressions type inference. Πολύ ακριβής και η αναφορά στις διαφορές ανάμεσα στα local και interpreted queries καθώς, στα subqueries και φυσικά στη LINQ to SQL.

Ο υπόλοιπος οδηγός παρουσιάζει τους query operators ομαδοποιημένους ανάλογα με την λειτουργία τους (filtering, projecting, ordering κοκ). Για κάθε operator δίνεται τόσο το lamdba όσο και το query syntax.

Είναι γνωστό στη κοινότητα οτι όσο μεγάλη ευκολία και εξοικονόμηση χρόνου παρέχει η LINQ άλλο τόσο εύκολη είναι η δημιουργία σπάταλων, μη αποδοτικών queries που μεταφράζονται σε τερατώδη SQL statements. Πιστεύω πως η ανάγνωση του πρώτου μέρους του οδηγού αντιμετωπίζει αποτελεσματικά ακριβώς αυτό το πρόβλημα.

Τέλος, ο οδηγός "συνοδεύεται" από το LINQPad, ένα δωρεάν εργαλείο με το οποίο μπορούμε οχι μόνο να εκτελέσουμε όλα τα παραδείγματα του βιβλίου (έρχονται μάλιστα έτοιμα με την εγκατάσταση) αλλά και να δούμε το παραγόμενο SQL statement που αντιστοιχεί στο εκάστοτε LINQ query.



To LINQPad παρέχει πολύ περισσότερα απ' τα προαναφερθέντα, δεν είναι υπερβολή οτι μπορεί να αντικαταστήσει το SQL Server Management Studio στην εργαλειοθήκη μας και μάλλον αξίζει δικό του blog post.

ASP.NET Design Patterns (Καλή Χρονιά, 2013)

Δημοσιεύτηκε στις Δευτέρα, 14 Ιανουαρίου 2013 9:10 πμ από το μέλος dpant :: 1 σχόλια
Καταχώρηση στις κατηγορίες: ,
Καλή Χρονιά σε όλους και όλες.



Λίγο πρίν το ξεκίνημα της νέας χρονιάς έπεσε στα χέρια μου το Professional ASP.NET Design Patterns (εκδόσεις Wrox). Αν και λίγο παλιό, πολύ ενδιαφέρον, γεμάτο παραδείγματα και sample code. Το τρίτο μέρος του βιβλίου παρουσιάζει ως case study ένα πλήρως λειτουργικό eshop. Για την υλοποίηση του χρησιμοποιούνται φυσικά όλα τα design principles, patterns και οι τεχνολογίες (StructureMap, NHibernate, AutoMapper, GoF patterns, S.O.L.I.D, MVP, MVC, Unit Of Work, Query Object, Active Record κ.α.) που παρουσιάζονται στα υπόλοιπα κεφάλαια του βιβλίου. Έμφαση δίνεται στη Domain Driven Design (DDD) μεθοδολογία. Ανάμεσα σ' όλα, αναφέρεται και το κλασσικό ASPX code behind μοντέλο ως Page Controller pattern Smile

H αρχιτεκτονική που προτείνεται για τη δημιουργία μεγάλων asp.net έργων είναι συγκεκριμμένη και ακολουθείτε σε όλο το βιβλίο. Κάθε layer (Model, Domain, Infrastructure, Service, Repository, Presentation, UI) παρουσιάζεται σταδιακά και όλα μαζί "δένουν" στο case study. Κάτα τη γνώμη μου, η προσέγγιση αφορά πράγματι μόνο σε μεγάλα έργα ενώ για μεσαία ή μικρά μάλλον αποτελεί overkill. Ωστόσο, οι ιδέες και οι τεχνικές υλοποίησης των patterns εφαρμόζονται παντού.

Τέλος, πολύ ενδιαφέρον θα ήταν η προσαρμογή του βιβλίου σε νεότερες εναλλακτικές όπως η Linq-To-Sql ή το EF (στο οποίο υπάρχει μικρή αναφορά-παράδειγμα).


1η μέρα με τα Windows 8 Consumer Preview

Δημοσιεύτηκε στις Κυριακή, 4 Μαρτίου 2012 10:01 πμ από το μέλος dpant :: 1 σχόλια
Καταχώρηση στις κατηγορίες: ,

 

c0Τα Windows 8 εγκαταστάθηκαν (Core 2 Duo, 4GB RAM). Αν χρησιμοποιήσετε το εργαλείο εγκατάστασης που προτείνει η Microsoft τότε απλά κατεβάζετε 5MB, ξεκινάτε την εγκατάσταση μέσα από τα Windows που ήδη έχετε και όλα τα υπόλοιπα έρχονται στον υπολογιστή σας κατευθείαν από το Internet. Για ένα Λειτουργικό Σύστημα τέτοιου μεγέθους η διαδικασία είναι πρωτόγνωρη και φανταστική.

Από τα screenshots που πήρα κατά τη διάρκεια της εγκατάστασης νομίζω τα πιο σημαντικά είναι αυτά:

c5c13

“Feel free to keep using your PC”

Έλεγχος συμβατότηταςc3a

Η διαδικασία εγκατάστασης περιλαμβάνει έλεγχο συμβατότητας των εφαρμογών και των συσκευών σας. Για το 2ο δεν τίθεται καν το ζήτημα όπως άλλωστε έχουμε συνηθίσει με τα Windows τα τελευταία χρόνια. Όλες οι συσκευές αναγνωρίστηκαν και δούλεψαν άψογα. Από την άλλη, καμία από τις υπάρχουσες εφαρμογές δεν ήταν συμβατή (βλέπε εικόνα: Compatibility report).

 

Λειτουργία & Παρατηρήσεις

  • Όλοι ψάχνουν να βρουν το Start button αλλά μάταια. Τα πράγματα είναι απλά: το Start button τώρα λέγεται Start Screen, καταλαμβάνει όλη την οθόνη και εμφανίζεται –εκτός των άλλων τρόπων, όταν πατάτε το πλήκτρο Start στο πληκτρολόγιο.
  • Τα Settings είναι context-based. Ανάλογα το που βρίσκεστε ή/και με ποιά εφαρμογή (τώρα λέγονται και εδω apps) δουλεύετε θα δείτε διαφορετικές ρυθμίσεις. Προσοχή: οι ρυθμίσεις για το Metro και το Desktop είναι διαφορετικές. Εγώ, τουλάχιστον, αναγκάστηκα να ρυθμίσω τις γλώσσες και την ημ/νια-ώρα ξεχωριστά.
  • Το δεξί κλικ μπορεί να σας σώσει ειδικά τις πρώτες αναγνωριστικές ώρες. Και εδώ ισχύει το ίδιο με τις ρυθμίσεις: ανάλογα που είστε η πράσινη μπάρα που θα εμφανιστεί στο κάτω μέρος της οθόνης θα περιλαμβάνει διαφορετικές επιλογές.
  • Από το Windows Store μπορείτε να κατεβάσετε διάφορα καλούδια δωρεάν. Δοκιμάστε το και δείτε την Start Screen να γεμίζει με Tiles. Για Uninstall, δεξί κλικ Ο Γελαστούλης κλείνει το μάτι
  • Οι περισσότερες προ-εγκατεστημένες εφαρμογές θα χρειαστούν τη σύνδεση σας με το windows Live λογαριασμό σας. Δοκιμάστε το οπωσδήποτε, άλλωστε αυτός είναι πλέον και ο σκοπός.
  • Αν κατά την εγκατάσταση επιλέξετε να διατηρηθούν τα προσωπικά σας δεδομένα πράγματι αυτά θα υπάρχουν. Επίσης θα δημιουργηθεί και ο φάκελος Windows.old ο οποίος έχει νόημα αν επιλέξετε να μην διατηρηθεί τίποτα. Στην περίπτωση αυτή η εγκατάσταση μεταφέρει τα δεδομένα σας στον φάκελο αυτό για χρήση backup κλπ. Προσοχή: δεν μπορείτε να χρησιμοποιήσετε αυτό τον φάκελο για να επαναφέρεται την προηγούμενη εγκατάσταση των Windows που είχατε.
  • Στο dekstop, αξιοσημείωτο είναι το νέο Ribbon που υπάρχει στον Windows Explorer.
  • Μην ξεχάσετε να δοκιμάσετε τον IE 10 ειδικά στην Metro έκδοση.
  • Υπομονή με το ποντίκι και την αριστερή μπάρα που τώρα λέγεται Windows Tab και είναι το αντίστοιχο του Alt+Tab. Αν έχετε ανοικτές πολλές εφαρμογές και δεν δείτε τις μικρογραφίες τους, προσέξτε τα αχνά περιγράμματα… μετακινώντας το ποντίκι εκεί εμφανίζονται. (αλήθεια, δεν ξέρω αν έτσι υποτίθεται ότι πρέπει να είναι ή αν αυτό θα διορθωθεί ή αν κάτι πρέπει να ρυθμίσω στην εγκατάστασή μου).

 

Metro vs Desktop

Ο τίτλος της παραγράφου είναι παραπλανητικός. Είναι λίγο πολύ σαν να συγκρίνει μήλα με πορτοκάλια. Το Metro UI είναι φτιαγμένο για ταμπλέτες και τηλέφωνα. Πως θα τα πάει; Αυτό μένει να κριθεί. Σαν 1η εμπειρία φαίνεται πολύ καλό, έστω και με το ποντίκι. Δεν πιστεύω όμως ότι μπορεί εύκολα να χρησιμοποιηθεί από χρήστες PCs ειδικά χωρίς οθόνες αφής. Το ποντίκι λειτουργεί παντού αλλά είμαι σίγουρος 100% ότι η αντίστοιχη εμπειρία με τα δάκτυλα θα είναι εντελώς διαφορετική (καλύτερη). Και ποιός ο λόγος άλλωστε να χρησιμοποιηθεί και στα PCs; Αυτό είναι ένα καλό ερώτημα και δεν είμαι ο μόνος που αναρωτιέται.

Το desktop είναι το … desktop. Το πιο πιθανό για όσους δουλέψουν με αυτό είναι να το γεμίσουν με shortcuts των εφαρμογών τους. Θεωρώ δηλαδή απίθανο να μεταφέρονται οι χρήστες μεταξύ αυτού και της Start Screen για να βρούν και να ξεκινήσουν εφαρμογές. Το Control Panel υπάρχει αν και το βρίσκεις δύσκολα (και αυτό σε shortcut θα μπει μάλλον!). Ωστόσο υπάρχουν και οι προσαρμοσμένες ρυθμίσεις μέσω της charms bar. Το look & feel είναι unpolished σε σχέση με τα Windows 7… πάνε οι διαφάνειες και οι σκιές… κάποια πράγματα είναι μεγαλύτερα για να προσαρμόζονται στην αφή υποθέτω αλλά δεν θα έλεγα οτι το desktop είναι touch-ready, αντικειμενικά. Πάρτε ως παράδειγμα των IE 10: απίθανο να μπορέσει κάποιος να τον ρυθμίσει από το κλασσικό παράθυρο των Internet Options με το δάκτυλο! Αντίθετα οι Metro εφαρμογές για φωτογραφίες, βίντεο, email, ο IE 10 Metro κοκ είναι σουπερ touch-ready. Θα χρειαστεί λοιπόν ποτέ το desktop σε έναν tablet user; Και αν χρειαστεί, θα μπορέσει να χρησιμοποιηθεί απρόσκοπτα;

Αλήθεια, τι γνωρίζετε για το DNS;

Δημοσιεύτηκε στις Κυριακή, 26 Φεβρουαρίου 2012 11:04 πμ από το μέλος dpant :: 0 σχόλια
Καταχώρηση στις κατηγορίες:

Κάπου πήρε το αυτί μου ότι οι λεγεώνες των Anonymous σκοπεύουν να “κλείσουν” το Internet επιτιθέμενοι στους κεντρικούς DNS Servers του. Δεν με απασχολούν ιδιαίτερα οι λεπτομέρειες της επίθεσης (αν κατάλαβα καλά θα δημιουργήσουν ένα άνευ προηγουμένου bottleneck δρομολογώντας έναν απύθμενο αριθμό DNS αιτήσεων στους συγκεκριμένους servers) και το κατά πόσο αυτό είναι εφικτό μένει να αποδειχθεί. Ένα ερώτημα όμως είναι: πόσο καλά γνωρίζουμε το Domain Name Service, μια υπηρεσία που όλοι καθημερινά χρησιμοποιούμε και η οποία αποτελεί θεμελιώδη λίθο του Internet;

 

Λίγη Ιστορία

Το DNS είναι μια υπηρεσία ονοματοδοσίας (naming service) σχεδιασμένη ώστε να μπορεί να χρησιμοποιηθεί σε διάφορες υλοποιήσεις. Παρά το γεγονός, λοιπόν, ότι, αρχιτεκτονικά, μπορεί να υποστηρίξει πολλά και διάφορα σύνολα ονομάτων (name spaces), στην πραγματικότητα το DNS χρησιμοποιείται κυρίως στο Internet και η βάση δεδομένων του (δηλαδή, το σύνολο των ονομάτων τα οποία χειρίζεται) αποτελείται από τα γνωστά μας domain names. Η ανακάλυψή του αποδίδεται στον Mockapetris το 1987 και περιγράφεται στο RFC 1034.

 

Υπηρεσίες Ονοματοδοσίας και Ονόματα

Όπως κάθε κατανεμημένο σύστημα (distributed system) έτσι και το Internet περιλαμβάνει μια υπηρεσία ονοματοδοσίας, το DNS. Γενικά μιλώντας, χρησιμοποιούμε ένα όνομα κάθε φορά που θέλουμε να αναφερθούμε σε κάποιο πόρο (resource), π.χ. σε κάποιο αρχείο, σε κάποιον υπολογιστή ή ακόμα και σε κάποιον άλλο χρήστη του (δια)δικτύου. Προφανώς, όσο πιο εύκολα μπορούμε να θυμηθούμε ένα όνομα τόσο πιο πετυχημένο θεωρείται αυτό. Στην περίπτωση του Internet, τα domain names και τα URLs που χρησιμοποιούμε καθημερινά είναι απείρως πιο πετυχημένα σε σχέση με τις διευθύνσεις IP. Η δουλειά λοιπόν του DNS είναι να αντιστοιχεί ονόματα με υπολογιστές και πιο συγκεκριμένα με τις διευθύνσεις IP αυτών.

Για να το πετύχει αυτό και δεδομένου ότι πρόκειται για ένα παγκόσμιο σύστημα, χρησιμοποιεί ένα ιεραρχικό σύνολο ονομάτων (hierarchical name space). Θεωρητικά, ένα σύνολο ονομάτων είναι η συλλογή όλων των έγκυρων ονομάτων που μπορεί να αναγνωρίσει ένα σύστημα ονοματοδοσίας. Το DNS για παράδειγμα δεν θεωρεί ως έγκυρο όνομα υπολογιστή το “…”. Το οτι τα domain names είναι δομημένα ιεραρχικά έχει επίσης μεγάλη σημασία. Πρώτον, τα ιεραρχικά σύνολο ονομάτων επιτρέπουν στο σύστημα να μεγαλώσει χωρίς φραγμούς (θεωρητικά, άπειρα) και δεύτερον επιτρέπουν στα ίδια ονόματα να χρησιμοποιηθούν ξανά και ξανά υπό διαφορετικό πλαίσιο (context). Έτσι, το όνομα “www” αναφέρεται αλλού όταν είναι μέρος του domain “www.yahoo.com” και αλλού όταν πληκτρολογήσουμε “www.google.com”.

Τέλος, το σύνολο ονομάτων του DNS είναι χωρισμένο τόσο γεωγραφικά (π.χ. uk, gr κοκ) όσο και βάση μιας θεματικής οργάνωσης (π.χ. com, net, org, edu κοκ). Επειδή δεν υπάρχει μόνο μια διαχειριστική αρχή για το σύνολο των ονομάτων αλλά πολλές κάθε μια εκ των οποίων είναι υπεύθυνη για το δικό της υποσύνολο, τα ονόματα χωρίζονται σε χώρους ονομάτων (naming domains), δηλαδή χώρους ευθύνης διαχείρισης και συντήρησης του αντίστοιχου τμήματος της βάσης ονομάτων του DNS.

 

DNS Name Servers

Εκτός όμως από την προαναφερθείσα οργάνωση των ονομάτων ένα σύστημα τόσο μεγάλης κλίμακας χρειάζεται και άλλες τεχνικές για να μπορεί να ανταποκρίνεται. Η τεράστια βάση ονομάτων του DNS είναι κατανεμημένη σε ένα λογικό δίκτυο από servers. Για να ικανοποιηθεί και πρακτικά ο ένας από τους βασικούς στόχους του DNS που είναι η απαίτηση κάθε τοπική αρχή να διαχειρίζεται το δικό της χώρο ονομάτων, η βάση αναπαράγεται τμηματικά με την ύπαρξη τοπικών servers. Για κάθε τμήμα της βάσης δεν υπάρχει μόνο ένας server αλλά τουλάχιστον δυο (replication).Τα δεδομένα που διατηρεί κάθε server είναι κυρίως τα ονόματα του τοπικού χώρου. Η κάθε διαχειριστική αρχή είναι υπεύθυνη για την ενημέρωση αυτών των δεδομένων τα οποία θεωρούνται επίσημα δεδομένα (authoritative data) για τον εκάστοτε χώρο και οι servers στους οποίους αποθηκεύονται ονομάζονται authoritative ή primary ή master servers. Τα δεδομένα αυτά αναπαράγονται περαιτέρω σε ένα σύνολο από secondary servers. Με λίγα λόγια, για κάθε χώρο ονομάτων υπάρχει ένα σύνολο από servers που παρέχει επίσημα δεδομένα ονοματοδοσίας.

Εκτός από τους τοπικούς servers υπάρχουν servers τόσο για τους ευρύτερους χώρους (π.χ. για το yahoo.com ή το ac.uk) όσο και για τον αρχικό χώρο (root domain). Ο,τι αναφέρθηκε στην προηγούμενη παράγραφο για την αναπαραγωγή των δεδομένων ισχύει και εδώ.

 

Αναζήτηση και Εύρεση (Name Resolution)

Όπως φαίνεται και από την οργάνωση των name servers, κάθε αίτηση αντιστοίχισης ονόματος σε IP ικανοποιείται από τους τοπικούς servers του χώρου ονομάτων στον οποίο ανήκει και το εν λόγω όνομα. Αυτός άλλωστε είναι και ο στόχος: το φόρτο εργασίας να κατανέμεται έτσι ώστε να μην χρειάζεται οι αιτήσεις να φτάνουν στους servers του αρχικού χώρου (rοοt servers) προς διεκπεραίωση αν και υπάρχουν αναφορές ότι οι τελευταίοι εξακολουθούν να εξυπηρετούν πάνω από 1000 αιτήσεις το δευτερόλεπτο. Βέβαια, όπως άλλωστε υπονοείται από τον καταμερισμό των δεδομένων, οι τοπικοί servers δεν μπορούν να ικανοποιήσουν όλες τις αιτήσεις χωρίς την βοήθεια άλλων name servers. Για την διεκπεραίωση των αιτήσεων που αφορούν ονόματα εκτός του χώρου δικαιοδοσίας τους οι τοπικοί servers διατηρούν συνδέσεις με άλλους name servers και οπωσδήποτε με έναν ή περισσότερους root servers. Επίσης, γνωρίζουν την διεύθυνση ενός επίσημου server του γονικού χώρου (για παράδειγμα, γονικός χώρος για τα ac.uk και co.uk θεωρείται ο uk).

Η εύρεση λοιπόν μιας διεύθυνσης IP περιλαμβάνει την αναζήτηση δεδομένων σε έναν ή περισσότερους name servers. Το DNS υποστηρίζει δυο μεθόδους αναζήτησης, την αναδρομική (recursive) και την επαναληπτική (iterative) αν και οι name servers εγγυώνται μόνο για την λειτουργία της δεύτερης. Η διαφορά τους (βλέπε Σχήμα 1) είναι οτι στην επαναληπτική, ο client επικοινωνεί αρχικά με τον τοπικό name server και αν αυτός δεν γνωρίζει το όνομα προς εύρεση τότε προτείνει την διεύθυνση ενός άλλου name server. Είναι στην ευθύνη του ίδιου του client να επικοινωνήσει εν συνεχεία με τον καινούργιο αυτό name server σε αντίθεση με την αναδρομική μέθοδο όπου ο κάθε name server λειτουργεί ως client μέχρι να ολοκληρωθεί να αναζήτηση και να επιστραφεί το αποτέλεσμα. Στην δεύτερη αυτή περίπτωση ο αρχικός client επικοινωνεί μία φορά μόνο με τον τοπικό server.

imageimage

Σχήμα 1

Σε κάθε περίπτωση, για την δραματική βελτίωση της απόκρισης του συστήματος, οι name servers διατηρούν προσωρινά τα αποτελέσματα των προηγούμενων αναζητήσεων (caching). Καθώς τα αποτελέσματα αυτά περιλαμβάνουν δεδομένα εκτός του χώρου δικαιοδοσίας τους –με άλλα λόγια τα δεδομένα δεν είναι επίσημα (authoritative), η διατήρησή τους στην cache γίνεται για ένα συγκεκριμένο χρονικό διάστημα μετά το πέρας του οποίου ο name server εκτελεί και πάλι την αναζήτηση με τις μεθόδους που αναφέρθηκαν παραπάνω. Για τους ίδιους λόγους βελτίωσης, το DNS επιτρέπει το “πακετάρισμα” πολλαπλών αιτημάτων σε ένα καθώς και το “πακετάρισμα” πολλών αποτελεσμάτων σε μια απάντηση από τους name servers.

 

Περισσότερες Πληροφορίες

Υπάρχουν άπειρες πηγές για το DNS που καλύπτουν με πολύ πιο τεχνικό τρόπο όλες τις πτυχές του συστήματος. Σκοπός αυτού του άρθρου δεν ήταν φυσικά η πλήρης ανάλυση του DNS –αυτό θα απαιτούσε πολλές σελίδες με πολλές τεχνικές λεπτομέρειες. Αν πάντως θέλετε να διαβάσετε περισσότερα για τον τρόπο αποθήκευσης των δεδομένων στους servers (ζώνες δεδομένων, resource records κοκ) καθώς επίσης για τα Aliases και την ανάστροφη αναζήτηση (reverse resolution) τότε μια έγκυρη πηγή είναι το Distributed Systems Concept and Design των Coulouris, Dollimore, Kindberg απο τις εκδόσεις Addison Wesley.

IIS 7.5 + ISAPI HOW TO

Δημοσιεύτηκε στις Κυριακή, 19 Φεβρουαρίου 2012 6:51 πμ από το μέλος dpant :: 0 σχόλια
Καταχώρηση στις κατηγορίες: ,

In my last post I’ve mentioned connecting the JavaScript client-side code to various server data sources and have had a WCF HTTP service implemented as an example. Another –rather old fashioned but still viable, option is an ISAPI serving JSON data.

You can, of course, create the ISAPI DLL using a number of tools. What I’ve always had difficulty remembering though is the exact steps needed to host the DLL in IIS. If nothing else this post is a reminder on how to have an ISAPI hosted in a Virtual Directory under IIS 7.5, which ships with Windows 7.

 

Install IIS

Install IIS if you haven’t already done so. Besides the bare minimum make sure you have the ISAPI options (ISAPI Extensions and ISAPI Filters) checked as shown in the figure below.

Capture1

 

Configure for ISAPI DLL

  1. Open IIS Manager.
  2. Assuming you already have a Virtual Directory created under the Default Web Site node select it and double click the Handler Mappings icon.
  3. Click Edit Feature Permissions in Actions panel.
  4. Check Execute in the Edit Feature Permission dialogue.

Capture2

Enable ISAPI modules

  1. Click on the root node and double click the ISAPI and CGI Restrictions icon.
  2. Click Edit Feature Setting in Actions panel.
  3. Check Allow unspecified ISAPI modules option.

Capture3

Set security permissions

Please note that the following steps must not be taken on a deployment server as is. I could use a helping hand on amending this part of the guide by providing the exact accounts and permissions that should be used on deployment servers (please email me or leave a comment if interested in helping).

  1. Select the Virtual Directory and double click the Authentication icon.
  2. Select the Anonymous Authentication item and click Edit in Actions panel.
  3. Check the Application pool identity option and close the dialogue.
  4. Right click on the Virtual Directory node and click Edit Permission in the popup menu.
  5. Use the Security tab to add the IIS_IUSRS or Everyone account and give sufficient permissions.

Capture4

Enable 32bit ISAPI DLL on IIS 7 x64

If you are using IIS 7 x64 and would like to run 32 bit ISAPI DLL you need to follow the following steps:

  1. Click the Application Pools node.
  2. Select the DefaultAppPool item and click Advanced Settings from the Actions panel.
  3. Set the Enable 32-Bit Applications to true.

Capture5

 

You are good to go Γελαστούλης

ExtJS + JSON data HOW TO

Δημοσιεύτηκε στις Κυριακή, 12 Φεβρουαρίου 2012 6:42 πμ από το μέλος dpant :: 1 σχόλια
Καταχώρηση στις κατηγορίες: , , , , ,

Based on a nice (but alas not working) idea and as a follow up to my previous post about the fantastic Ext.NET framework [Greek language] today I present you with a how-to guide to Ext JS.

First, let me remind you that Ext JS is the powerful JavaScript framework behind Ext.NET. Once again, it is worth mentioning that the Ext.NET guys have done a truly great job wrapping .NET around the JavaScript engine.

In this post, we are going to see how we can build a simple HTML page featuring an Ext JS 4 grid that consumes JSON data provided by a server source. Please note that this is a pure AJAX-enabled client side scenario as opposed to the usage of the Ext.NET GridPanel server component.

 

IIS Setup

This guide requires you to use IIS as the web server. Before we move on make sure you have a web application set up and ready with the same folder structure as shown in Figure 1.

Capture

Figure 1. The folder structure of the hosting web application (Tests).

 

The client

To begin with, download the Ext JS 4 library (the Open Source Version is free) and extract its contents inside the root folder of your web application. The newly created folder will be named something like ext-4.0.7-gpl. Rename it to extjs. Next, create an HTML page (index.htm) and place it in the web application’s root folder.

<html>
<head>
  <meta equiv="Content-Type" content="text/html; charset=utf-8">
  <title>Grid Example 1</title>
  <link rel="stylesheet" type="text/css" href="extjs/resources/css/ext-all.css">
  <script type="text/javascript" src="extjs/adapter/ext/ext-base.js"></script>
  <script type="text/javascript" src="extjs/ext-all-debug.js"></script>
</head>
<body>
  <script type="text/javascript" src="grid1.js"></script>
  <h1>Grid Example 1</h1>
  <div id="grid1"></div>
</body>
</html> 

Apart from using the core Ext JS files the page also needs the presence of the grid1.js file. This is where we set up both the Ext.grid.GridPanel and the Ext.data.JsonStore JavaScript components. The latter makes an AJAX call to retrieve the JSON data with which the grid is filled. I won’t delve into the code as it is self-explaining and straightforward (if it isn’t please let me know and I will elaborate further).

Ext.onReady(function(){

 var dataStore = new Ext.data.JsonStore({
    proxy: {
        type: 'ajax',
        url: 'WcfService/SampleJsonData.svc/GetData',
        reader: {
            type: 'json',
            root: 'd'
        }
    },
    fields: [
      {name: 'firstname', type: 'string'},
      {name: 'lastname', type: 'string'},
      {name: 'age', type: 'string'},
      {name: 'phone', type: 'string'}
    ]
  });
  
    dataStore.load(); 
    var myGrid1 = new Ext.grid.GridPanel({
      id: 'customerslist',
      store: dataStore,
      columns: [
        {id: "firstname", header: "First Name", width: 100, dataIndex: "firstname", sortable: true},
        {header: "Last Name", width: 100, dataIndex: "lastname", sortable: true},
        {header: "Age", width: 100, dataIndex: "age", sortable: true},
        {header: "Phone", width: 100, dataIndex: "phone", sortable: true}
      ],
      autoLoad: false,
      stripeRows: true,
      autoHeight: true,
      width: 400,
      height: 200,
      renderTo : 'grid1'
    });
});

 

The server data source

The data source mentioned in the url property of the Ext.data.JsonStore proxy can be anything, really. In the example above it is an endpoint of a WCF HTTP service but it might as well be an ASP.NET web page or an ISAPI dll (located in the cgi-bin folder). No matter what its nature is the server must return JSON-formatted data exactly as the following sample demonstrates:

{"d":[{"age":35,"firstname":"Leonardo","lastname":"Rame","phone":"12345678"},
{"age":30,"firstname":"John","lastname":"Williams","phone":"4567890"},
{"age":28,"firstname":"Cecilia","lastname":"Strada","phone":"4345467"}]}
Please note the root d element, which is also the value of the root property of the Ext.data.JsonStore proxy as well as the matching field names. In fact, the WFC service’s response contains a little bit more but no harm is done.

 

The WCF service

There are certain things you must pay attention to when you build and configure the WCF HTTP service. Using Visual Studio, the easiest way is to create a new ASP.NET Empty Web Application and add an AJAX-enabled WCF Service to it. You now have a service that listens for HTTP GET requests and can be called from a URL (in our example, http://SERVER/Tests/WcfService/SampleJsonData.svc/GetData). The web.config is properly configured and the only thing remaining is to define the GetData operation, which returns the JSON data:

        [OperationContract]
        [WebGet(ResponseFormat = WebMessageFormat.Json)]
        public Customer[] GetData()
        {
            return new Customer[] {
                new Customer() { firstname = "Leonardo", lastname = "Rame", age = 35, phone = "12345678" },
                new Customer() { firstname = "John",  lastname = "Williams", age = 30, phone = "4567890" },
                new Customer() { firstname = "Cecilia", lastname = "Strada", age = 28, phone = "4345467" }
            };
        }
    }

    public class Customer
    {
        public string firstname { get; set; }
        public string lastname { get; set; }
        public int age  { get; set; }
        public string phone { get; set; }
    }

Note how WCF automatically serializes the array of Customer objects to JSON format, a process that is completely transparent to the developer.

Below you can see the result of navigating to the /Tests/index.htm page:

imageimage

Opinion: Can mobile clients redefine the web?

Δημοσιεύτηκε στις Δευτέρα, 6 Φεβρουαρίου 2012 9:37 πμ από το μέλος dpant :: 1 σχόλια

I saw one of my students do a crazy thing the other day. He and his friends were watching videos on YouTube but with a twist; before each video started they had had its title changed with the help of Firebug (the Firefox’s extension, which allows you to view and manipulate the DOM of a web page). Clearly, they were extremely happy with the results but they knew it wasn’t a permanent thing.

But what if it could be?

At that very moment, two questions crossed my mind. First, why on earth don’t we just drop the read only nature of web pages? We have excellent tools to play with the DOM and we are comfortable enough with their usage, apparently. Even school kids understand Firebug and Firebug is not a toy, mind you. So, what if we had a Rights Management scheme applied to web pages thus allowing changes by everyone granted with write permissions? But what about dynamic content?

Which –somehow, made me ask the second question. Why do we still use online Content Management Systems?

Back in the desktop PC era we couldn’t afford walking around with our clients. 3Kg of weight was considered a burden too even though laptops was a great step towards mobility. Instead, we’ve decided to move our CMS software online, which enabled us to access it from everywhere without the need of carrying neither our hardware nor software with us.

It was a decision that came with a great price to pay.

Web applications never became (and never will be, I believe) as rich as desktop applications as far as the user interface is concerned. For years and years to come most of us were forced to make with the dreadful but all too common interface shown in Figure 1 and came to even think of it as evolutionary.

Capture

Figure 1. Is most online content created with this interface?

 

Let’s be honest. People have been struggling to make ends meet with such horrible tools for far too long. Just compare it with any of your desktop applications if you dare.

Today we are experiencing the era of very rich, very capable and very mobile hardware clients, all at the same time. I believe it is about time to move the CMS software back to the clients. The notion of “Apps” is a good (and a highly successful) sign towards this trend. The UI is not the only concern. Think of all the security we apply to web applications just because they are available (and vulnerable) to everyone online. What about all the technical stuff people have had to become comfortable with? URLs, proxies, cookies, the stateless nature of the web… Do you remember the browsers’ war?

The web is past its age of innocence. We now have extremely capable, mobile clients we can take advantage of. We have mature and very powerful tools to build even more powerful software that will reside in our clients and will provide us with the best experience of online content management we have ever had. Think of the web as just a facade, a display medium. That’s what it initially was and that’s what it is , still. All the rest can be left to mobile clients to handle.

 

D. Pantazopoulos, MSc.

 

Disclaimer: The opinions and ideas expressed in this post are mine and do not necessarily reflect the opinions and ideas of the host (dotnetzone.gr).

Ext.NET GridPanel HOW-TO

Δημοσιεύτηκε στις Κυριακή, 5 Φεβρουαρίου 2012 2:26 μμ από το μέλος dpant :: 1 σχόλια
Καταχώρηση στις κατηγορίες: ,

Στο σημερινό Sunday’s Dev Digest παρουσιάζω ένα απλό παράδειγμα χρήσης του Ext.NET GridPanel.

Τι θα χρειαστούμε:

  • Ένα ASP.NET Empty Web Application (Visual Studio –> File –> New –> Project –> ASP.NET Empty Web Application)
  • Μια ASPX σελίδα (Δεξί κλίκ στο project –> Add –> New Item –> Web Form)
  • Εγκατάσταση του Ext.NET στο project. Ο πιο εύκολος τρόπος είναι να κάνουμε χρήση του NuGet package και στο Package Manager Console (View –> Other Windows –> Package Manager Console) γράφουμε:
install-package ext.net

Για την χρήση των Ext.NET components στην ASPX σελίδα μας χρειαζόμαστε οπωσδήποτε την δήλωση του Ext.Net Assembly:

<%@ Register Assembly="Ext.Net" Namespace="Ext.Net" TagPrefix="ext" %>

και χρήση του Ext.Net ResourceManager component στην αρχή της σελίδας (θεωρείτε, αν θέλετε, τον ResourceManager κάτι σαν τον ScriptManager του ASP.NET AJAX):

<ext:ResourceManager runat="server" />

Το Ext.NET GridPanel

Για να χρησιμοποιήσουμε το GridPanel εισάγουμε το παρακάτω markup:

<ext:GridPanel ID="GridPanel1" runat="server" Title="Σκευάσματα" Border="false" StripeRows="true" TrackMouseOver="true"
                AutoExpandColumn="Skeyasma" Icon="Table" StoreID="Store1">              
    <ColumnModel>
        <Columns>
            <ext:RowNumbererColumn />
            <ext:Column ColumnID="Id" Header="Id" DataIndex="id" />
            <ext:Column ColumnID="Skeyasma" Header="Product" DataIndex="skeyasma">
                <Editor>
                    <ext:TextField ID="TextField1" runat="server" />
                </Editor>
            </ext:Column>
            <ext:Column ColumnID="Timh" Header="Price" DataIndex="timh" Align="Right">
                <Renderer Format="EuroMoney" />
                <Editor>
                    <ext:TextField ID="TextField2" runat="server" />
                </Editor>
            </ext:Column>
        </Columns>
    </ColumnModel>
    <View>
        <ext:GridView ForceFit="true" />
    </View>
    <SelectionModel>
        <ext:RowSelectionModel ID="RowSelectionModel1" runat="server">
        </ext:RowSelectionModel>
    </SelectionModel>
    <SaveMask ShowMask="true" />
    <LoadMask ShowMask="true" />
</ext:GridPanel>  

Το GridPanel χρειάζεται ένα μοντέλο στηλών (ColumnModel) το οποίο καθορίζει τις στήλες που θα εμφανίζονται. Η κάθε στήλη συνδέεται με ένα data field μέσω του DataIndex property. Επίσης, μπορούμε να ορίσουμε πιο component επιθυμούμε ως editor για κάθε στήλη όταν τo grid βρίσκεται σε κατάσταση edit. Στο παραπάνω παράδειγμα, όταν διορθώνουμε ή προσθέτουμε μια εγγραφή, η καταχώρηση για τις στήλες Skeyasma και Timh θα γίνεται μέσω ενός απλού textbox. Αντίθετε η στήλη Id δεν ορίζει Editor και έτσι παραμένει μόνο-για-ανάγνωση (πρόκειται άλλωστε για το auto increment key field του πίνακα). Πρόκειται λοιπόν για ένα grid το οποίο μας παρέχει όλες τις δυνατότητες CRUD (μπορούμε να εισάγουμε, να διορθώσουμε και να διαγράψουμε δεδομένα).

To View περιλαμβάνει επιλογές για τον τρόπο προβολής των δεδομένων στο grid ενώ το SelectionModel απλά καθορίζει πως θα γίνεται η επιλογή των δεδομένων (στο παράδειγμά μας, επιτρέπεται η επιλογή ολόκληρης της γραμμής (data row) όπου και αν κάνει κλικ ο χρήστης).

Τέλος, ορίζουμε ότι επιθυμούμε να εμφανίζεται μήνυμα αναμονής όταν διαβάζουμε ή αποθηκεύουμε δεδομένα. Όλες οι λειτουργίες υλοποιούνται μέσω AJAX και όταν είναι χρονοβόρες το grid εμφανίζεται ως εξής:

image

Το DataStore

Πως όμως επικοινωνεί το grid με την πηγή των δεδομένων; Ανέφερα παραπάνω ότι οι στήλες συνδέονται με data fields. Που όμως ορίζονται αυτά; Η απάντηση βρίσκεται στο Ext.Net Store component. Είναι μια από τις δυο έννοιες που πρέπει να συνηθίσει κανείς όταν δουλεύει με το Ext.NET (η δεύτερη είναι τα Events).

Το Ext.Net Store καθορίζει ακριβώς ποιά είναι η πηγή των δεδομένων και ποιά data fields θέλουμε να χρησιμοποιήσουμε. Καθορίζει επίσης την μορφή με την οποία θέλουμε να τα “καταναλώσουμε” (JSON, XML ή Array Reader), τις ιδιότητες των πεδίων (π.χ. ποιό είναι το key field), το sortάρισμα που πιθανόν θέλουμε κ.ο.κ. Τέλος, έχουμε την δυνατότητα να ορίσουμε μια σειρά από event handlers για διάφορα γεγονότα όπως π.χ. OnRefreshData, OnSubmitData, ΟnException κ.ο.κ. Είναι σημαντικό να αναφέρουμε ότι οι event handlers μπορεί να είναι τόσο server όσο και client side (C# methods ή Javascript functions αντίστοιχα).  Περισσότερα για τo Ext.Net Event Model σε επόμενο post.

Το Ext.Net Store είναι πανίσχυρο. Μπορεί να συνδεθεί με διάφορα data sources, για παράδειγμα με έναν SQL Server ή αρχεία XML. Στο σημερινό παράδειγμα θα συνδεθούμε με τον SQL Server μέσω ενός κλασσικού, απλού SqlDataSource component:

Σημείωση: το ConnectionString και η πηγή δεδομένων του παραδείγματος αναφέρονται σε μια δική μου SQL Server βάση, με έναν πίνακα τριών πεδίων (id,skeyasma,timh). Φυσικά, πρέπει να ορίσετε το δικό σας ConnectionString και να συνδεθείτε σε μια δική σας βάση αλλάζοντας τα ονόματα των πεδίων κλπ.

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:pharmakadbConnectionString %>" 
    DeleteCommand="DELETE FROM [pharmaka_skeyasmata] WHERE [id] = @id" 
    InsertCommand="INSERT INTO [pharmaka_skeyasmata] ([timh], [skeyasma]) VALUES (@timh, @skeyasma); SELECT @newId = @@Identity;" 
    SelectCommand="SELECT [id], [timh], [skeyasma] FROM [pharmaka_skeyasmata] WHERE [human]=0" 
    UpdateCommand="UPDATE [pharmaka_skeyasmata] SET [timh] = @timh, [skeyasma] = @skeyasma WHERE [id] = @id">
    <DeleteParameters>
        <asp:Parameter Name="id" Type="Int32" />
    </DeleteParameters>
    <InsertParameters>
        <asp:Parameter Name="timh" Type="String" />
        <asp:Parameter Name="skeyasma" Type="String" />
        <asp:Parameter Direction="Output" Name="newId" Type="Int32" />
    </InsertParameters>
    <UpdateParameters>
        <asp:Parameter Name="timh" Type="String" />
        <asp:Parameter Name="skeyasma" Type="String" />
        <asp:Parameter Name="id" Type="Int32" />
    </UpdateParameters>
</asp:SqlDataSource>

<ext:Store ID="Store1" runat="server" DataSourceID="SqlDataSource1"
    ShowWarningOnFailure="false"
    OnRefreshData="Store1_RefershData">
    <Reader>
        <ext:JsonReader IDProperty="id">
            <Fields>
                <ext:RecordField Name="id" />
                <ext:RecordField Name="timh" />
                <ext:RecordField Name="skeyasma" />
            </Fields>
        </ext:JsonReader>
    </Reader>
    <SortInfo Field="skeyasma" Direction="ASC" />
    <Listeners>
        <LoadException Handler="Ext.Msg.alert('Load failed', e.message || e);" />
        <CommitFailed Handler="Ext.Msg.alert('Commit failed', 'Reason: ' + msg);" />
        <SaveException Handler="Ext.Msg.alert('Save failed', e.message || e);" />
    </Listeners>  
</ext:Store>  

Το SqlDataSource σας πρέπει να έχει τα κατάλληλα SQL Queries για Insert, Delete, Update, Select. Tο Ext.Net Store τα χρησιμοποιεί αυτόματα για να υλοποιήσει όλες τις λειτουργίες CRUD. Η σύνδεση γίνεται μέσω του DataSourceID property και το grid συνδέεται με το Store μέσω του StoreID property.

Ας δούμε και τον server side event handler για το OnRefreshData event του Store. O κώδικας της Store1_RefreshData μεθόδου είναι απλός αλλά δείχνει πως μπορούμε να χειριστούμε το Ext.Net framework από το code behind (προσέξτε το απαραίτητο using statement):

using Ext.Net;
...

protected void Store1_RefershData(object sender, StoreRefreshDataEventArgs e)
{
    this.Store1.DataBind();
}

Είμαστε έτοιμοι. Έχουμε ένα grid το οποίο όχι μόνο μας παρουσιάζει δεδομένα αλλά μας επιτρέπει να προσθέσουμε, να διαγράψουμε και να τα διορθώσουμε (με διπλό κλικ σε κάθε κελί, πηγαίνουμε σε κατάσταση edit και εμφανίζεται ο κατάλληλος Editor).

Τι άλλο χρειαζόμαστε; Μια ωραία Ext.Net Toolbar με buttons που θα μας επιτρέπουν να αποθηκεύουμε τις αλλαγές, να προσθέτουμε μια νέα γραμμή δεδομένων στο grid, να σβήνουμε μια γραμμή και να ανανεώνουμε (refresh) τα δεδομένα:

<ext:Toolbar ID="Toolbar1" runat="server">
    <Items>
        <ext:Button ID="Button1" runat="server" Text="Save" Icon="Disk">
            <Listeners>
                <Click Handler="#{GridPanel1}.save();" />
            </Listeners>
        </ext:Button>
        <ext:Button ID="Button2" runat="server" Text="Delete" Icon="Delete">
            <Listeners>
                <Click Handler="#{GridPanel1}.deleteSelected();" />
            </Listeners>
        </ext:Button>
        <ext:Button ID="Button3" runat="server" Text="Insert" Icon="Add">
            <Listeners>
                <Click Handler="#{GridPanel1}.insertRecord(0, {});#{GridPanel1}.getView().focusRow(0);#{GridPanel1}.startEditing(0, 0);" />
            </Listeners>
        </ext:Button>
        <ext:Button ID="btnRefresh" runat="server"  Text="Refresh" Icon="ArrowRefresh">
            <Listeners>
                <Click Handler="#{GridPanel1}.reload();" />
            </Listeners>
        </ext:Button>
    </Items>
</ext:Toolbar>

Παρατηρήστε ότι όλες οι λειτουργίες υλοποιούνται μέσω μεθόδων του Ext.Net GridPanel (GridPanel1.save κ.ο.κ) τις οποίες καλούμε client side. Επαναλαμβάνω ότι όλα γίνονται μέσω AJAX και δεν υπάρχει κανένα postback της ASPX σελίδας.

Για λόγους εμφάνισης, το Toolbar και το GridPanel συνδιάζονται σε ένα Ext.Net Panel και το αποτέλεσμα είναι αυτό:

image

 

Μπορείτε να βρείτε το πλήρες markup (περιλαμβάνει και το Ext.Net Panel) εδώ.

Ext.NET

Δημοσιεύτηκε στις Κυριακή, 29 Ιανουαρίου 2012 11:58 πμ από το μέλος dpant :: 0 σχόλια
Καταχώρηση στις κατηγορίες: ,

Για όσους δεν το γνωρίζουν, είναι το Ext.NET μια φανταστική συλλογή εργαλείων για ASP.NET.

Το πρώτο ενδιαφέρον στοιχείο είναι το dual licensing που εκτός της επί πληρωμής Pro έκδοσης περιλαμβάνει την απολύτως δωρεάν Community έκδοση με την οποία μπορείτε να πειραματιστείτε ή/και να την χρησιμοποιήσετε στα προσωπικά ή ενδο-εταιρικά σας projects. Πληροφορίες και για τα δυο licenses εδω. Παρόλο που η Community έκδοση είναι πλήρως λειτουργική, υπάρχουν πράγματα που παρέχονται μόνο στην Pro όπως για παράδειγμα το localization του Calendar component (στην Community είναι μόνο στα Αγγλικά).

Τεχνικά το Ext.NET είναι ένα wrapper framework γύρω από την βιβλιοθήκη JavaScript Ext JS. Η ενσωμάτωση στο Visual Studio και η χρήση στα projects σας είναι απρόσκοπτη και όλα πραγματικά λειτουργούν άψογα εφόσον κάνετε την απλούστατη δήλωση:

<%@ Register Assembly="Ext.Net" Namespace="Ext.Net" TagPrefix="ext" %>

 

imageΗ εργαλειοθήκη περιλαμβάνει πάνω από 100 components (όχι και άσχημα, έτσι; ) και ειδικά τα Grids με τα οποία έχω δουλέψει είναι καταπληκτικά τόσο λειτουργικά όσο και αισθητικά. Αν και θα επεκταθώ επ’ αυτού σε επόμενο post, αξίζει να σημειωθεί ότι έχουν όλες τις δυνατότητες που θα περίμενες κανείς από ένα ολοκληρωμένο, σύγχρονο data grid.

Για την εκμάθηση του Ext.NET το learning curve δεν είναι ακριβώς μια ευθεία γραμμή αλλά αν κάποιος “πιάσει” την φιλοσοφία του event model και των (data) Stores τότε βρίσκεται στον σωστό δρόμο προς την επιτυχία. Η έλλειψη documentation είναι ένα μειονέκτημα αλλά τα online demos με το διαθέσιμο source code τους δείχνουν ποιές ακριβώς είναι οι δυνατότητες και πως υλοποιούνται! Το forum είναι επίσης μια άριστη πηγή γνώσης και υποστήριξης και σας διαβεβαιώνω ότι η ανταπόκριση στα ερωτήματα είναι άμεση.

Το Ext.NET είναι διαθέσιμο και σε πακέτο NuGet. Επαναλαμβάνω ότι η εγκατάσταση και χρήση του είναι εντελώς απρόσκοπτη, χωρίς εκπλήξεις ή διαφοροποιήσεις από τον τρόπο χρήσης των standard components του Visual Studio, για παράδειγμα.

 

 

Αναλυτικότερα σε επόμενο post, με παραδείγματα.

Ανάκτηση βάσης SQL Server από αρχείο .BAK

Δημοσιεύτηκε στις Κυριακή, 22 Ιανουαρίου 2012 4:06 μμ από το μέλος dpant :: 0 σχόλια
Καταχώρηση στις κατηγορίες: ,

Δουλεύετε με τον SQL Server Express και δεν έχετε το Management Studio εγκατεστημένο; Ανακτήστε μια βάση δεδομένων από αρχείο .BAK στον server με το πανταχού παρόν sqlcmd.

Απο το command line:

sqlcmd –U [USERNAME] –P [PWD] –S [SERVER INSTANCE] -d master 
-q "RESTORE DATABASE [DB NAME] FROM DISK = 'C:\…\[ΑΡΧΕΙΟ.bak]'"