2η παρουσίαση στο DI : ASP.NET 2

(Αν και αρκετά καθυστερημένα) γράφω εδώ για την 2η παρουσίαση που έγινε στο τμήμα Πληροφορικής και Τηλεπικοινωνιών του Πανεπιστημίου Αθηνών με θέμα την ASP .NET 2, από τον Στέλιο Καραμπασάκη και από εμένα, την Παρασκευή 8 Ιουνίου 2007, στην Αίθουσα Α. Η αφίσα που χρησιμοποιήθηκε για την προβολή/διαφήμιση της εκδήλωσης καθώς και το ενημερωτικό thread που άνοιξε στο StudentGuru βρίσκονται εδώ

Τέλος, συννημένα βρίσκονται τα demos και το powerpoint που χρησιμοποίησα κατά τη διάρκεια της παρουσίασης.

Ευχαριστίες:

  • Στο Στέλιο για την πολύ καλή συνεργασία μας.
  • Στην υπόλοιπη ομάδα των MSP (dimis, grnemo) για την όλη βοήθεια και συμπαράστασή τους.
  • Στους (αρκετούς, παρά τις προσδοκίες μας) φοιτητές και φοιτήτριες που ήρθανε και μας παρακολουθήσανε, μέσα σε αυτό τον κυκεώνα τον εξεταστικών και των εργασιών.

Vista Gadget Debugging

Προσπαθούσα να φτιάξω ένα Vista Gadget χθες το βράδυ, και διαπίστωσα ότι το alert της Javascript δεν παίζει… Συνεπώς, μην έχοντας κάποιο περιβάλλον για την ανάπτυξη gadget, έψαξα για πιο ‘old-school’ μεθόδους. Βρήκα αυτό το εξαιρετικό εργαλείο της SysInternals, το DbgView, το οποίο μπορείτε να το κατεβάσετε από εδώ
http://www.microsoft.com/technet/sysinternals/utilities/debugview.mspx
Όπως λέει και η περιγραφή του, μπορεί να ‘πιάσει’ debug information από διάφορες πηγές

Under Windows 95, 98, and Me DebugView will capture output from the following sources:

Win32 OutputDebugString

Win16 OutputDebugString

Kernel-mode Out_Debug_String

Kernel-mode _Debug_Printf_Service

Under Windows NT, 2000, XP, Server 2003 and Vista DebugView will capture:

Win32 OutputDebugString

Kernel-mode DbgPrint

All kernel-mode variants of DbgPrint implemented in Windows XP and Server 2003

DebugView also extracts kernel-mode debug output generated before a crash from Window NT/2000/XP crash dump files if DebugView was capturing at the time of the crash.

Έτσι λοιπόν, χρησιμοποιώντας την System.Debug.outputString(string message) άπό το Javascript source του gadget, κατάφερα να κάνω output διάφορες πληροφορίες, τις οποίες και μετά παρατήρησα από το παράθυρο του DbgViewSmile

Όχι και η καλύτερη μέθοδος debugging, αλλά, μέχρι στιγμής, it’s better than nothing Smile

Paging In SQL Server 2005

Πολλές φορές, όταν εκτελούμε SQL queries, θέλουμε να πάρουμε ένα ορισμένο υποσύνολο από τα δεδομένα που θα παίρναμε κανονικά. Για παράδειγμα, το query

SELECT * FROM products ORDER BY ProductID ASC

στην Northwind database (πρόκειται για μία test database της Microsoft, μπορείτε να την κατεβάσετε από εδώ) φέρνει 77 rows. Πολύ εύκολα μπορούμε να πάρουμε τα πρώτα X rows από ένα table, χρησιμοποιώντας την έκφραση TOP. Δηλαδή, το query

SELECT TOP 10 * FROM products ORDER BY ProductID ASC

θα μας φέρει τα πρώτα 10 rows. Τι κάνουμε, όμως, όταν θέλουμε να φέρουμε συγκεκριμένα rows (π.χ. από το 5ο ως το 10ο); Σε εκδόσεις του sql server πριν την 2005, μπορούσαμε να χρησιμοποιήσουμε την έφραση set rowcount = X, όπου περιορίζαμε στο maximum τα rows που μπορεί να μας φέρει ένα query. Στη έκδοση 2005 όμως, έχουμε την έκφραση ROW_NUMBER() OVER (ORDER BY FieldName ASC/DESC). Το query

SELECT ROW_NUMBER() OVER (ORDER BY ProductID ASC), products.* FROM products ORDER BY ProductID ASC

θα μας φέρει όλα τα rows από το table Products, με το κάθε ένα row να έχει σαν πρώτο πεδίο ένα rownumber, όπου αυτό είναι ένας ακέραιος που μας δείχνει έναν αύξοντα αριθμό για το row. Το ROW_NUMBER παίρνει μετά το OVER μια έκφραση που του υποδεικνύει με βάση πιο πεδίο να κάνει το sorting και συνεπώς να βάλει τα rownumbers. Με τη χρήση του ROW_NUMBER μπορούμε λοιπόν πολύ εύκολα να φτιάξουμε την κάτωθι stored procedure που θα μας φέρνει συγκεκριμένα subsets δεδομένων

CREATE PROCEDURE usp_GetpagedProducts

@PageSize int,

@TargetPage int

AS

BEGIN

WITH tmp_cte AS

(

SELECT ROW_NUMBER() OVER (ORDER BY ProductID ASC) As Row, Products.* FROM Products

)

SELECT * FROM tmp_cte

WHERE Row BETWEEN (@TargetPage 1) * @PageSize + 1 AND @TargetPage*@PageSize

END

Χρησιμοποιώντας common table expressions (CTE – περισσότερα για αυτά σε επόμενο blog postWink) κρατάμε ένα resultset στη μνήμη με όλα τα products μαζί με το rownumber που τους αντιστοιχεί, και στο τέλος πετυχαίνουμε το paging με την χρήση των παραμέτρων της stored procedure (@PageSize είναι ο αριθμός των rows που επιθυμούμε να μας φέρει και @TargetPage είναι το συγκεκριμένο subset που θέλουμε). Για παράδειγμα, κλήση της stored procedure ως εξής

usp_GetPagedProducts 6,1

θα μας φέρει τα πρώτα 6 rows (rownumber από 1 ως 6), ενώ κλήση της stored procedure ως εξής

usp_GetPagedProducts 6,3

θα μας φέρει τα ‘τρίτα’ 6 rows (rownumber από 13 ως 18).

 

System.Text.StringBuilder

Ο τύπος δεδομένων string, είναι immutable στο .NET Framework. Πρακτικά αυτό σημαίνει, ότι όταν δημιουργήσουμε ένα string, τότε το περιεχόμενό του δεν μπορεί να αλλάξει. Δηλαδή, στο παρακάτω τμήμα κώδικα

string s = “Hello”;
s +=
” World”;

το s αρχικά δείχνει σε μία θέση μνήμης όπου είναι αποθηκευμένο το “Hello”. Με την προσθήκη (concatenation) του ” World”, το s πλέον δείχνει σε άλλη θέση μνήμης, στην οποία είναι αποθηκευμένο το “Hello World”. Συνεπώς, είναι προφανές ότι η επεξεργασία strings έχει κάποιο performance hit, ειδικά όταν έχουμε πολλά strings. Η λύση του .NET Base Class Library για αυτό είναι το object System.Text.StringBuilder

[SerializableAttribute]
[ComVisibleAttribute(true)]
public sealed class StringBuilder : ISerializable

Το StringBuilder είναι mutable αντικείμενο, δηλαδή το περιέχόμενό του μπορεί να αλλάξει. Η χωρητικότητα του δεν μπορεί να είναι μεγαλύτερη από System.Int32.MaxValue, και η default είναι 16.

Μερικά properties

  • Capacity (read/write) : επιστρέφει/θέτει το μέγιστο αριθμό χαρακτήρων που μπορεί να χωρέσει το συγκεκριμένο instance
  • MaxCapacity (read) : επιστρέφει το μέγιστο αριθμό χαρακτήρων που μπορεί να χωρέσει το συγκεκριμένο instance
  • Length (read/write) : επιστρέφει/θέτει το μήκος του περιεχόμενου string

Μερικές συναρτήσεις

  • Append (με 18 overloads) : προσθέτει Unicode χαρακτήρες (ή και άλλους τύπους δεδομένων) στο τέλος του περιεχόμενου string
  • Insert (με 17 overloads) : τοποθετεί Unicode χαρακτήρες (ή και άλλους τύπους δεδομένων) σε συγκεκριμένο σημείο του περιεχόμενου string (περνιέται σαν παράμετρος)
  • Remove : σβήνει x χαρακτήρες από το περιεχόμενο string στο σημείο y (x,y παράμετροι)
  • Replace (με 3 overloads) : αντικαθιστά χαρακτήρες ή ενσωματωμένα strings

 Για να πάρουμε το περιεχόμενο string του StringBuilder, αρκεί να καλέσουμε την συνάρτηση .ToString() που κληρονομεί από το System.Object.

 Να τονιστεί ότι οι συναρτήσεις του StringBuilder επενεργούν στο ίδιο object, αντί να επιστρέφουν ένα καινούριο, όπως γίνεται στην περίπτωση του string.

Δηλαδή, για τύπο string γράφουμε

string s =“Hello Woorld”;
s = s.Replace(
“oo”,“o”);

Ενώ για StringBuilder γράφουμε 

StringBuilder s = new StringBuilder(“Hello Woorld”);
s.Replace(
“oo”,“o”);

LEGO Mindstorms, Intro

Όλοι μας, μικροί και μεγάλοι σίγουρα θα έχουμε παίξει με LEGO. Με αυτά τα πολύχρωμα τουβλάκια που τα έστηνες όπως ήθελες, τους έβαζες και μικρά ανθρωπάκια και περνούσες πολύ ευχάριστα την ώρα σου. Η τεχνολογία όμως προοδεύει, και το ίδιο και τα LEGO. Έχω την τιμή να έχω προσωρινά στην κατοχή μου ένα LEGO Mindstorms (many many thanx to Fotis for this!!!!). Στην ιστοσελίδα της LEGO για τα Mindstorms, η οποία είναι εδώ, μπορείτε να δείτε πληροφορίες για αυτά, παρουσιάσεις, καθώς και software. Ποια είναι λοιπόν η ιδέα πίσω από τα LEGO Mindstorms; Η ιδέα είναι βασικά ότι πρόκειται για εύκολα προγραμματιζόμετα robots με αισθητήρες! Τα ρομποτάκια μπορούν να προγραμματιστούν να αντιδρούν σε ερεθίσματα που δέχονται οι αισθητήρες τους, και είτε να περιστραφούν, είτε να κινηθούν, είτε να κάνουν κάτι άλλο.

Ας περάσουμε αρχικά στο κουτί του Mindstorms, φωτογραφία του οποίου μπορείτε να δείτε εδώ Free Image Hosting at www.ImageShack.us

Ανοίγοντας το κουτί, μπορούμε να δούμε τα τουβλάκια (φυσικά!!!), κάποιες εύκολα κατανοήσιμες οδηγίες κατασκευής του robot, ένα CD με software για προγραμματισμό του robot, καλώδιο σύνδεσης με τον υπολογιστή, το NXT (λεπτομέρειες πιο κάτω) και ένα μεγάλο φύλλο χαρτιού (test pad για να κινείται το ρομποτάκι). Ενδεικτικές φωτογραφίες: Free Image Hosting at www.ImageShack.us Free Image Hosting at www.ImageShack.us Free Image Hosting at www.ImageShack.us

 

Το φυλλάδιο οδηγιών έχει οδηγίες για προγραμματισμό του ρομπότ μέσω ενός ειδικού software της LEGO (με το οποίο μπορεί κάποιος πανεύκολα να προγραμματίσει το ρομπότ – περισσότερα για αυτό σε επόμενο blog postSmile, και οδηγίες για κατασκευή ενός τύπου ρομπότ όχι σαν κι αυτό που φαίνεται στο κουτί, αλλά αυτόν: Free Image Hosting at www.ImageShack.us Free Image Hosting at www.ImageShack.us Free Image Hosting at www.ImageShack.us

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

Το ρομποτάκι περιλαμβάνει 4 αισθητήρες.

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

Περιλαμβάνει επίσης δύο “κινητήρες”, δύο motors που δίνουν κίνηση στο ρομπότ. Οι αισθητήρες και τα δύο motors συνδέονται στο NXT, φωτογραφία του οποίου μπορείτε να δείτε εδώ: Free Image Hosting at www.ImageShack.us

Το ΝΧΤ είναι ο εγκέφαλος του Mindstorms. Περιλαμβάνει μια LCD οθόνη με 4 κουμπιά για διαχείριση του robot, μια ενσωματωμένη bluetooth συσκευή, τη θύρα για να συνδεθεί με PC μέσω του USB καλωδίου που περιλαμβάνεται στη συσκευασία, καθώς και θύρες για να συνδεθούν τα καλώδια που φεύγουν από τους αισθητήρες του ρομπότ. Έχει ενσωματωμένη μνήμη 64kb (35kb περίπου διαθέσιμα για τις εφαρμογές που θα του βάλετε – ναι, είναι κάπως λίγα Sad), λειτουργεί με 6 AA/LR6 μπαταρίες και έχει ένα ενσωματωμένο ηχειάκι για αναπαραγωγή απλών ήχων. Το firmware του NXT είναι αναβαθμίσιμο, κατεβάζετε το firmware από το site και το περνάτε μέσω του προγράμματος της LEGO, για το οποίο θα αναφερθώ σε επόμενο blog post. ΠΡΟΣΟΧΗ, όσοι έχετε το ΝΧΤ μην βάλετε το 1.04 firmware, το δοκίμασα και δεν αναγνωριζόταν το robot από το PC μετά Sad. Το 1.03 είναι μια χαρά, πάντως…

Απαιτήσεις συστήματος για να παίξει σύνδεση ΝΧΤ με PC:

  • Inter Pentium ή συμβατός, 800MHz τουλάχιστον
  • Windows XP SP2 τουλάχιστον (είναι συμβατό με Vista)
  • 256ΜΒ RAM τουλάχιστον
  • Μέχρι και 300ΜΒ σκληρού δίσκου
  • 1024×768 ανάλυση οθόνης
  • 1 USB θύρα
  • CD-ROM drive
  • Bluetooth adapter (προαιρετικά)

Τιμή του ρομπότ (από Amazon): 249.99$

Σε επόμενα blog post, θα αναφέρω πώς μπορεί να γίνει προγραμματισμός του ρομπότ, είτε μέσω του software της LEGO, είτε μέσω του Microsoft Robotics Studio!

Stay tuned!!!! Smile

 

ΥΓ. Ζητώ συγνώμη για την κακή ποιότητα των φωτογραφιών, αλλά με μόνη κάμερα την ψηφιακή του QTEK 9100, that was the best I could do.. Sad

Χρήση Javascript σε ASP .NET 2

Σήμερα χρειάστηκε σε μια ASP .NET εφαρμογή που φτιάχνω, να χρησιμοποιήσω κάποιες javascript functions. Μιας και ήθελα να παίζει σε μία συγκεκριμένη content page και όχι σε όλες, δεν μπορούσα να το γράψω με τον κλασσικό τρόπο ( //mpla mpla ) στον HTML κώδικα της Master σελίδας.

Με λίγο ψάξιμο, είδα πως γίνεται προγραμματιστικά. Η ASP .NET χρησιμοποιεί το νέο Page.ClientScript property για να δηλώσει Javascript κώδικα.
Το ClientScript object έχει πολλά properties και methods, θα αναφερθώ σε 3 από αυτές.

Χρήση του Page.ClientScript.RegisterClientScriptBlock

Η Page.ClientScript.RegisterClientScriptBlock μας επιτρέπει να δηλώσουμε μία javascript συνάρτηση στην κορυφή της σελίδας.
Δηλαδή, με κώδικα στο Load της σελίδας όπως ο παρακάτω

string myScript = @”function sayHi() {alert(‘Hi’);}”;
Page.ClientScript.RegisterClientScriptBlock(this.GetType(),”MyScript”,myScript,true);

και χρήση του onClientClick=”sayHi()” σε ένα Web Control, μπορούμε να χρησιμοποιήσουμε Javascript η οποία θα φορτώνει κατά την εκκίνηση της σελίδας και πριν το <body> στοιχείο της σελίδας.

Χρήση του Page.ClientScript.RegisterStartupScript

Η διαφορά της με την προηγούμενη είναι ότι τοποθετεί το script στο τέλος της σελίδας και όχι στην αρχή. Χρησιμοποιείται για να γραφεί Javascript κώδικας ο οποίος θα έχει reference σε συγκεκριμένα HTML controls της σελίδας, οπότε και θα πρέπει να γραφεί στο HTML output αφού έχουν τοποθετηθεί τα HTML controls στη σελίδα από τον browser (χρήση της RegisterClientScriptBlock με αυτό τον τρόπο θα δημιουργούσε javascript error).

Χρησιμοποιείται ως εξής
string myScript = @”function sayHi() {alert(document.forms[0][‘TextBox1’].value);}”; /*με την προυπόθεση ότι έχουμε ένα textbox με ID TextBox1 στη σελίδα μας*/
Page.ClientScript.RegisterClientScriptBlock(this.GetType(),”MyScript”,myScript,true);
 

Χρήση του Page.ClientScriptRegisterClientScriptInclude 

Αυτή η συνάρτηση χρησιμοποιείται για να φορτώσουμε .js αρχεία, στα οποία έχουμε γράψει τις Javascript συναρτήσεις μας.

Χρησιμοποιείται ως εξής
string myScript = “myjs.js”;
Page.ClientScript.RegisterClientScriptInclude(“myKey”,myScript);

και δίνει το ακόλουθο HTML αποτέλεσμα

http://myjs.js 

Μικρός οδηγός για SQL Server 2005 Merge Replication with Web synchronization

Μιας και τις τελευταίες μέρες ασχολήθηκα αρκετά με merge replication μέσω web synchronization για sql server 2005, θα παραθέσω εδώ μερικά απλά βηματάκια για να το υλοποιήσετε μέσω των GUIs του SQL Server Management Studio και να γίνει η ζωή σας πιο εύκοληBig Smile

Να αναφερθεί όλες οι εκδόσεις του sql server 2005 εκτός από την express, μπορούν να λειτουργήσουν ως publishers και distributors. 

Αρχικά, θα ήταν καλό να δημιουργήσουμε έναν νέο windows user στον publisher, ώστε με τα κατάλληλα permissions να χρησιμοποιηθεί για το replication, αλλά και ένα sql server login, το οποίο θα πρέπει να είναι συσχετισμένο με ένα database user ο οποίος να είναι dbowner στη βάση που θέλουμε να κάνουμε replicate.

 Αρχική Ρύθμιση του IIS

Το web synchronization μπορεί να παίξει είτε με IIS 5 ή 6. Αφού τον εγκαταστήσουμε στο σύστημά μας, θα πρέπει να του δώσουμε ένα SSL certificate, καθώς το web synchronization δουλεύει μέσω του https πρωτοκόλλου. Αν δεν έχουμε πιστοποιητικό από κάποιον παροχέα (π.χ. Verisign), μπορούμε να κατεβάσουμε το IIS 6 resource kit από εδώ, να το εγκαταστήσουμε και μετά να τρέξουμε το selfSSL.exe ώστε να εγκατασταθεί ένα πιστοποιητικό ασφαλείας για τον IIS μας. Κατόπιν, θα πρέπει να τρέξουμε μια management κονσόλα (Start->Run->mmc) και να κάνουμε add το snap-in για certificates. Αφού το κάνουμε αυτό, θα πρέπει να βρούμε το πιστοποιητικό που εγκαταστάθηκε, να του κάνουμε ένα export και μετά ένα import στο trusted root certificates store.

Ρύθμιση του publisher

Ανοίγουμε το  (SSMS) συνδεόμαστε στον database server μας ο οποίος θέλουμε να γίνει distributor. Πάμε στο σημείο που λέει replication, ανοίγουμε τα subnodes, επιλέγουμε αυτό με το όνομα ‘Local Publications’, δεξί κλικ και επιλέγουμε new publication. Αν δεν έχουμε ρυθμίσει τον sql server μας να είναι distributor, θα μας ζητηθεί να το κάνουμε. Καλό θα είναι το folder που θα αποθηκεύεται το snapshot να το έχουμε ρυθμίσει σαν UNC share, με τα κατάλληλα permissions. Στην επόμενη καρτέλα (replication type) επιλέγουμε merge publication, κατόπιν τα είδη sql server που πρόκειται να λειτουργήσουν σαν subscribers. Κατόπιν, επιλέγουμε ποια database objects θα είναι διαθέσιμα για replication, και αν αυτά θα είναι download only από το server ή αν αλλαγές σε αυτά από τους subscribers θα γίνονται apply στον Publisher. Στη συνέχεια, επιλέγουμε αν θέλουμε φίλτρα πάνω στα database objects που θα κάνουμε publish (π.χ. μέσω κάποιον sql queries). Τέλος, επιλέγουμε το πότε θα τρέχει ο snapshot agent και μετά τα security settings του, δηλαδή κάτω από ποια user permissions θα τρέχει (προφανώς θα πρέπει δικαιώματα εγγραφής στον UNC κατάλογο που περιγράψαμε παραπάνω) και πώς θα συνδέεται στον publisher. Το publication μας είναι πλέον έτοιμο, αφού του δώσουμε ένα όνομα.

Στη συνέχεια, κάνουμε δεξί κλικ στο publication που δημιουργήσαμε, και επιλέγουμε ‘Configure web synchronization’. Επιλέγουμε τον τύπο του sql server που θα χρησιμοποιήσει το virtual directory, και στην επόμενη καρτέλα επιλέγουμε το virtual directory που θα χρησιμοποιήσουμε. Θα αντιγραφεί εκεί πέρα το replisapi.dll, αρχείο απαραίτητο για το web synchronization. Επιλέγουμε ένα alias για το virtual directory και μετά επιλέγουμε τον τύπο του authentication που θα απαιτείται από το virtual directory, προκειμένου κάποιος subscriber να κάνει replication. Στη συνέχεια, επιλέγουμε έναν χρήστη που θα κάνει authentication, ώστε ο wizard να δώσει τα κατάλληλα permissions στο virtual directory. Τέλος, στην επόμενη καρτέλα, βάζουμε το UNC share για το snapshot folder.

Ο publisher μας είναι πλέον έτοιμος. Μπορούμε να δούμε το status του και πιθανά error messages από το replication monitor (δεξί κλικ πάνω στο publication και ‘Launch Replication Monitor’).

 

Ρύθμιση του subscriber

Στο node Local subscriptions, κάνουμε δεξί κλικ και επιλέγουμε ‘New subscriptions’. Συνδεόμαστε με τον Publisher, επιλέγουμε το publication και κατόπιν επιλέγουμε pull subscription (μιας και, προφανώς, το web synchronization δεν δουλεύει με push). Επιλέγουμε τη βάση του subscriber που θα κάνουμε replicate, και κατόπιν φτιάχνουμε τα security settings του merge agent. Στη συνέχεια, επιλέγουμε πότε θα τρέχει ο merge agent, είτε συνέχεια, είτε on demand, είτε με ένα schedule που θα του ορίσουμε εμείς. Στην επόμενη καρτέλα, επιλέγουμε το πότε θα γίνει initialize το subscription, μετά κάνουμε tick στο checkbox για να ενεργοποιηθεί το web synchronization, και στη συνέχεια δίνουμε τα στοιχεία για τη σύνδεση με τον IIS (δηλ. το URL και τα στοιχεία του χρήστη που φτιάξαμε στον publisher). Τελικά, επιλέγουμε αν το subscription θα είναι client type ή server type. Το subscription μας είναι έτοιμο.

Force web synchronization

Παραθέτω και RMO κώδικα σε VB .NET για να κάνετε force web synchronization (από SQL Server Books Online)

Public Sub SynchronizeWebNow()

        Dim publisherInstance As String = publisherName

        Dim hostname As String = “hostname”
        Dim webSyncUrl As String = “https://&#8221; + publisherInstance + “/VirtualDirectory/replisapi.dll”

        ‘ Create a connection to the Subscriber.
        Dim conn As ServerConnection = New ServerConnection(subscriberName, “username”, “password”)

        Dim subscription As MergePullSubscription
        Dim agent As MergeSynchronizationAgent

        Try
            ‘ Connect to the Subscriber.
            conn.Connect()

            ‘ Define the pull subscription.
            subscription = New MergePullSubscription()
            subscription.ConnectionContext = conn
            subscription.DatabaseName = subscriptionDbName
            subscription.PublisherName = publisherName
            subscription.PublicationDBName = publicationDbName
            subscription.PublicationName = publicationName

            ‘ If the pull subscription exists, then start the synchronization.
            If subscription.LoadProperties() Then
                ‘ Get the agent for the subscription.
                agent = subscription.SynchronizationAgent

                ‘ Check that we have enough metadata to start the agent.
                ‘If agent.PublisherSecurityMode = Nothing Then
                ‘ Set the required properties that could not be returned
                ‘ from the MSsubscription_properties table.

                agent.PublisherSecurityMode = SecurityMode.Standard
                agent.PublisherPassword = “publisherpassword”
                agent.PublisherLogin = “publisherusername”
                agent.Distributor = publisherInstance
                agent.DistributorSecurityMode = SecurityMode.Standard
                agent.DistributorLogin = “distibutorusername”
                agent.DistributorPassword = “distibutorpassword”
                agent.SubscriberLogin = “subscriberusername”
                agent.SubscriberSecurityMode = SecurityMode.Standard
                agent.SubscriberPassword = “subscriberpassword”
         

                ‘ Set optional Web synchronization properties.
                agent.UseWebSynchronization = True
                agent.InternetUrl = webSyncUrl

                agent.InternetSecurityMode = SecurityMode.Standard
                agent.InternetLogin = “windowsusername”
                agent.InternetPassword = “windowsuserpassword”
    

                ‘ Enable agent logging to the console.
                agent.OutputVerboseLevel = 1
                agent.Output = “”

                ‘ Synchronously start the Merge Agent for the subscription.
                agent.Synchronize()
            Else
                ‘ Do something here if the pull subscription does not exist.
                Throw New ApplicationException(String.Format( _
                 “A subscription to ‘{0}’ does not exist on {1}”, _
                 publicationName, subscriberName))
            End If
        Catch ex As Exception
            ‘ Implement appropriate error handling here.
            Throw New ApplicationException(“The subscription could not be ” + _
             “synchronized. Verify that the subscription has ” + _
             “been defined correctly.”, ex)
        Finally
            conn.Disconnect()
        End Try
    End Sub

 

Quick and dirty intro to .NET Framework

So…. what is this fuss all about Microsoftʼs .NET Framework? And how can it help the developer create better, more scalable, more reliable and more distributed applications? I hope to answer all this stuff here, soon.
To begin with, a major part of .NET consists of a set of DLLs, (for example System.dll, System.Data.dll, System.Drawing.dll, System.Xml.dll and so forth). These ʽassembliesʼ (to speak in a more .NET way) contain classes that we, developers, will use during development in order to create our fabulous programs! These assemblies encapsulate various I/O calls, thread creation/manipulation, DBMS access etc. and are called BCL (Base Class Libraries). Moreover, .NET consists of the execution engine, which is ofthen referred as CLR (Common Language Runtime). Primarily, the CLR is responsible of low level details such as memory allocation (C programmers, forger the * and & stuff !!) and security checks. Another fundamental block of .NET Framework is the CTS (Common Type System). The CTS strictly describes all possible data types and programming constructs that are permitted in the CLR and how these entities can be represented in .NET metadata format (.NET medatata is, rather abstractly speaking, the way for one .NET assembly to describe its object model to another assembly. Weʼll get to that later).
So, you might think, that you write down C#, you compile it, the result of the compilation is native platform code, so you take it and run it everywhere . Wrong. In .NET, there is really only one language. IL (Intermediate Language). You may see it referred as MSIL (Microsoft Intermediate Language), or CIL (Common Intermediate Language). I prefer to use the name IL, but you have to understand that IL, MSIL and CIL are the one and the same thing. Anyway, as I said, IL is the only .NET language. The other languages, like C#, VB .NET, J# are just .NET aware (full catalog of .NET aware languages is available
here – URL subject to change). What does this mean? It just means that you write down a program in the .NET aware language of your choice, and when you compile it with the appropriate compiler, it is then transformed into platform agnostic IL code and type metadata. When I say platform agnostic, I mean that the output IL code is completely unaware of the operating system that is to be executed.
More specifically, the result of the compilation is a .dll or .exe file called assembly containing

  1. IL code (just as Java source compilation results in bytecode)
  2. Metadata
  3. The assembly manifest ( it contains information about the current version of the assembly, culture information that is to be used for localization, and a list of any assemblies that are referenced and are needed for our assembly to run properly)

A last thing to mention, a .NET assembly can be single-file or multi-file. When it is multi-file, it (as you can easily understand) consists of several files, but one of them MUST be the primary file (called primary module).
This was a ʽquick and dirtyʼ intro to .NET framework.