|
|
Πρόσφατες Δημοσιεύσεις
-
|
Την παρακάτω procedure την χρησιμοποιώ όταν είμαι στο στάδιο ανάπτυξης για να βρίσκω εύκολα από ποιές sp εξαρτώνται οι πίνακες της βάσης μου. IF EXISTS ( select * FROM dbo. sysobjects WHERE id = object_id (N '[dbo].[Table_onProc_Depends_sp]' ) AND OBJECTPROPERTY (id, N 'IsProcedure' ) = 1) DROP PROCEDURE [dbo].[Table_onProc_Depends_sp] GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS OFF GO CREATE PROCEDURE Table_onProc_Depends_sp AS SELECT a.name as tableName, a.id as tableId, b.name as ProcName,b.id as ProcId FROM sysobjects a LEFT OUTER JOIN ( sysobjects b LEFT OUTER JOIN sysdepends on b.id = sysdepends .id) on sysdepends .depid = a.id WHERE a.xtype = 'u' AND b.xtype = 'p' AND NOT a.name = 'dtproperties' GROUP BY a.name, a.id, b.name,b.id ORDER BY a.name RETURN GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO Δεν είναι κάτι φοβερό αλλά πιστεύω οτι είναι εύχρηστο....
|
-
|
Η συνάρτηση επιστρέφει ένα Encrypted varchar στοιχείο .Για νά κάνετε un-encrypt το στοιχείο απλά περάστε στην παράμετρο το Encrypted varchar στοιχείο. CREATE FUNCTION PwdEncrypt ( @Pwd as varchar (255) ) RETURNS varchar (255) AS BEGIN DECLARE @PwdEncrypted as varchar (255) DECLARE @PwdLength as int DECLARE @iPOS AS int DECLARE @XOR AS int --Το Encryption γίνεται μόνο όταν η παράμετρος δέν είναι null IF @Pwd IS NOT NULL BEGIN SET @PwdLength = len (@Pwd) -- Δημιουργία κλειδιού σέ συνδυασμό μέ το μέγεθος του pwd και της θέσης του πρώτου 'α' που βρίσκεται στο pwd -- (Το γράμμα 'α' είναι ένα απο τα πιό κοινά γράμματα του αλφαβήτου) -- (Βέβαια μπορεί νά τροποποιηθεί ανάλογα όπως θέλετε) SET @XOR = @PwdLength + charindex (@Pwd, 'α' ) SET @iPOS = 1 SET @PwdEncrypted = '' WHILE @iPOS <= @PwdLength BEGIN SET @PwdEncrypted = @PwdEncrypted + char ( Ascii ( substring (@Pwd, @iPOS, 1)) ^ @XOR) SET @iPOS = @iPOS + 1 END END --Εάν η τιμή της παραμέτρου @Pwd είναι null τότε δέν γίνεται καμμία ενέργεια IF @Pwd IS NULL BEGIN...
|
-
|
Printing barcodes from your application is quite easy, as long as you get to know a simple algorithm (for the specific barcode symbology you're interested in) and you have a valid font file. Searching via Google on this subject is sometimes hard enough, because the top results come for commercial components or font distributors. In this article, I present a simple implementation for the code 128 specification, with the corresponding true type font file....
|
-
|
Ηταν ένα πρόβλημα που καιρό αντιμετώπιζα και έψαχνα μια πιό γενική λύση. Εχεις κάπου, για κάποιον λόγο, ένα ωραίο delimited string του στύλ "Mητσος,Κίτσος,Λάκης,Τακης" και θέλεις να δημιουργήσεις από αυτό ένα ωραίο result set, χρησιμοποιώντας μόνο SQL Server και τίποτα άλλο. Τι κάνεις; Με ψάξιμο από εδώ και από εκεί, πήρα τη "βάση" για μια User-Defined Function την οποία μπορεί να "ταίσει" κανείς ένα delimited string, να προσδιορίσει (αν θέλει) και τον delimiter character, και να πάρει ένα ωραίο table variable που περιέχει ένα element σε κάθε του γραμμή. Θα ανέφερα πηγές, αλλα δυστυχώς δεν τις θυμάμαι πιά :) , ζητώ συγνώμη προκαταβολικά... Μου φάνηκε ιδιαίτερα χρήσιμο σε αρκετές περιπτώσεις. Η παρούσα UDF λειτουργεί με το delimited string να είναι τύπου TEXT και το μέγιστο μήκος κάθε element 250 χαρακτήρες, ενώ σαν default delimiter χρησιμοποιεί το κόμμα (,). Ειναι όμως πολύ εύκολο να τα τροποποιήσετε όλα αυτά. Κώδικα και σχολιασμό θα βρείτε εδώ, στα άρθρα....
|
-
|
Το παρακάτω κείμενο αποτελεί απλά repost απο το dotnetzone forum , ενα σύντομο tutorial που έγραψα για το πως μπορούμε να καταχωρήσουμε ημερομηνίες σε ελληνικό format σε datetime πεδία στον SQL Server. Λοιπόν επειδή λογικά κάποιοι οι οποίοι τώρα ξεκινάτε να ασχολείστε με SQL Server, θα έχετε την απορία για πως μπορείτε να καταχωρήστε σε datetime πεδίο, ενα date σε ελληνικό format (dd/mm/yyy) και όχι στο international(yyyy/mm/dd) ή στο αμερικάνικο (mm/dd/yyy). Η αλήθεια είναι ότι απο default ο SQL SERVER δέχεται σαν φορμάτ μόνο το αμερικάνικο ή το international.Οποιαδήποτε άλλη προσπάθεια να κανέτε καταχώρηση ημερομηνίας σε ελληνικό φορμάτ, καταλήγει σε error. Πx. Το παρακάτω, βγάζει error: DECLARE @tDate AS datetime ; SET @tDate = '31/12/2006' ; SELECT @tDate; The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value. Υπάρχουν μερικοί τρόποι τους οποίους αναλύω παρακάτω. Α) Μπορείτε να κάνετε set την var DATEFORMAT του SQL Server σε όποιο format θέλετε εσείς Πχ. SET...
|
-
|
Εχετε φτιάξει μια εφαρμογή για χειρουργική κλινική; Ωραία! Μπορείτε, με μερικά απλά βήματα, να τη μετατρέψετε σε εφαρμογή κράτησης εισητηρίων! Ο πελάτης βιάζεται! Προσοχή όμως στις παρενέργειες......
|
-
|
Όλοι όσοι έχει χρειαστεί να γράψουμε documentation , έχουμε χρησιμοποιήσει διάφορα εργαλεία για να πάρουμε το επιθυμητό αποτέλεσμα. Ένα από αυτά τα εργαλεία, που είναι πολύ διαδεδομένο στους προγραμματιστές, είναι και το nDoc . Το nDoc δημιουργεί class library documentation για .NET assemblies σε γλώσσα C #. Με πολύ λίγη δουλειά και λίγες ρυθμίσεις μπορούμε να ικανοποιήσουμε τα απαιτητικά αφεντικά, που δεν σκέφτονται πόσο κοπιάσαμε να δημιουργήσουμε, αυτό που οι ίδιοι δεν ξέρουν τι ακριβώς έχουν ζητήσει και να τους παρουσιάσουμε ένα πλήρες documentation . Με το nDoc ήταν όλα καλά εφόσον η έκδοση του . Net Framework ήταν στην έκδοση 1.0 ή 1.1. Το πρόβλημα εμφανίστηκε, όταν στη αγορά άρχισε να κινείτε το . net Framework 2.0. Εκεί το nDoc δεν δούλευε και είχαν πεί ότι θα το υλοποιήσουν στην επόμενη έκδοση. Με ένα πολύ μικρό τρικ όμως, το nDoc παίζει κανονικά και για . net Framework 2. Η λύση είναι πολύ απλή. Θα πρέπει να δημιουργήσουμε ένα config αρχείο για το NDocGui . exe που θα βάλουμε τις ρυθμίσεις που χρειάζονται....
|
-
|
Code analysis εργαλείο που ελέγχει .NET managed code assemblies...
|
-
|
Σας ενοχλούν τα deadlines; Μην φοβάστε! Με αυτόν τον οδηγό επιβίωσης, το χειροτερο που μπορεί να πάθετε είναι ακριβώς το ίδιο που θα παθαίνατε ούτως ή άλλως. Τουλάχιστον, όμως, θα γελάσετε....
|
-
|
NEW YORK (Reuters) - Google Inc. and America Online Inc. Tuesday expanded their search and advertising alliance to include video and instant messaging, shutting out Microsoft Corp., which had fought hard for a deal with Time Warner Inc.'s AOL unit. America Online said Google had agreed to invest $1 billion to take a 5 percent stake in AOL, as part of an enhanced pact where Google will move beyond text-based advertising to allow AOL to sell graphical ads to Google's fast-growing ad network. Read the full article here: Google acquires stake in AOL I' ve found it in: startpoint.gr ....
|
-
|
Μετά από αρκετή διερεύνηση, επιχειρώντας να λύσω ένα συγκεκριμένο πρόβλημα, κατέληξα σε ένα "μπούσουλα" για τον τρόπο με τον οποίο μπορεί κάποιος να καλέσει με κώδικα μέσα από μια εφαρμογή ένα εξωτερικό process (ενα executable) χρησιμοποιώντας διαφορετικά user credentials από αυτά του χρήστη που "τρέχει" την εφαρμογή (ουσιαστικά δηλαδή να μιμηθούμε το "run as.." που μας δίνει το shell των Windows). Το θέμα αυτό έχει λόγο ύπαρξης μόνο στο .NET 1.1, μια και στο .NET 2.0 μπορεί κανείς να προσδιορίσει user credentials στο System.Diagnostics.Process.Start(). Θερμές ευχαριστίες, φυσικά, στους συναδέλφους του dotNetZone.gr (είναι αυτονόητο οτι χωρίς τη βοήθειά τους δεν θα επιζούσα): Ο παρακάτω κώδικας λειτουργεί για χρήστη που βρίσκεται σε domain και η κλήση έχει ως εξής: clsSpawnProcess.CreateProcess( _ "myUser" _ , "myDomain" _ , "myPassword" _ , "c:\myfolder\myexecutable.exe" _ , " " + "myCommandLineArguments" ) Η χρήση των υποδειγματικών strings που αναφέρονται στην κλήση, φαντάζομαι, είναι αυτονόητη. Ο κώδικας δουλεύει...
|
-
|
Εψαχνα αρκετές ημέρες, λόγω της μικρής μου εξοικείωσης με το design-time των user controls σε Windows Forms, για να καταλάβω πώς γίνεται να δημιουργήσουμε ένα string property το οποίο να φαίνεται μεν στον designer, αλλά να σου δίνει μια συγκεκριμένη λίστα επιλογών (ενα combo δηλαδή) για να διαλέξεις. Γενικά, αν χρησιμοποιήσουμε κάποιο enumeration, το πράγμα κυλάει μόνο του. Αν όμως έχουμε String property και θέλουμε να επιλέξουμε μεταξύ συγκεκριμένων Strings, τότε το πρόβλημά μας ανάγεται στο πρόβλημα που θα αντιμετωπίζαμε χρησιμοποιώντας οποιοδήποτε άλλο Object ως property του user control μας. Ητοι, για να δείξουμε μια combobox-style επιλογή σε design time για το συγκεκριμένο property του user control, χρειαζόμαστε ένα custom type converter. Θα δουμε παρακάτω πώς γίνεται αυτό. Καταρχήν χρειαζόμαστε μια νέα κλάση: Class MyListConverter Inherits System.ComponentModel.StringConverter 'Εδώ φορτώνουμε τις τιμές μας. Public Overloads Overrides Function GetStandardValues( _ ByVal context As System.ComponentModel.ITypeDescriptorContext)...
|
-
|
Τελικά σήμερα γυρίσαμε πίσω στο 2003. Τα προβλήματα ήταν αρκετά, κάποια από τα οποία πολύ σημαντικά, και δεν μας έπαιρνε να τραβήξει πολύ η κατάσταση προσαρμογής και εξεύρεσης work arounds δουλεύοντας σε production περιβάλλον. Για τη συνέχεια πάντως σκέφτομαι τα εξής: Θα γίνει προσπάθεια να γίνει μία φάση ακόμα debuging και τελικά lockdown σε projects που είναι βοηθητικά και δεν αλλάζουν συχνά, ώστε να βγούν έξω από το solution και να τα χρησιμοποιούμε με file reference. Αυτό αφ' ενός θα βοηθήσει όταν τελικά πάμε σε 2005, αλλά θα μας μειώσει ελαφρώς και το φόρτο του solution τώρα με το 2003. Δυστυχώς όμως αυτά τα projects είναι λίγα και αρκετά light. Θα συνεχιστεί το ψάξιμο για πατέντες στο σπάσιμο των projects σε διαφορετικά solutions. Το θέμα είναι εξαιρετικά δύσκολο κατά την άποψή μου γιατί μπλέκει μέσα και τον τρόπο που δουλεύει η εταιρία γενικότερα. Παρακολουθούμε προσεκτικά Microsoft και forums, ψάχνοντας για λύσεις και περιμένοντας hot fixes και service packs. Σίγουρα δεν μπορούμε να παρατήσουμε την προσπάθεια...
|
-
|
[Σε συνέχεια του Μετάβαση σε VS 2005: Περιπέτεια! ] Στο Visual Studio 2003 τα web projects είχαν παρόμοια δομή με τα win projects. Υπήρχε ένα αρχείο για το ίδιο το project (vbproj, csproj) το οποίο περιέγραφε ποια αρχεία ήταν μέρος του project. Στο 2005 το μοντέλο αλλάζει. Αρχείο για το project δεν υπάρχει, αντιθέτως θεωρούνται μέρος του projects όλα τα αρχεία που βρίσκονται στον δίσκο στον κατάλογο ο οποίος αντιστοιχεί στο web project. Αυτό σημαίνει, ότι όποιο αρχείο και αν προσθέσουμε από file system στον κατάλογο αυτόν ή στους υποκαταλόγους του, αυτομάτως θεωρείται μέρος του web project. Ας έρθουμε τώρα στο source safe, όταν το web project είναι source controlled. Όλα τα αρχεία που υπάρχουν στον δίσκο, αφού είναι μέρος του project, προστίθενται αυτομάτως στο VSS. Μοναδική εξαίρεση αποτελούν οι DLLs και τα PDB αρχεία τα οποία προέρχονται από project references (προσοχή, μόνο project references, όχι file references που έχουν copy local = true). Με το μοντέλο αυτό παρουσιάζει το εξής σημαντικό πρόβλημα: Web project...
|
-
|
Χτες ήταν η ημέρα που είχαμε καθορίσει για να μετατρέψουμε το solution μας στο νέο visual studio. Είχαν προηγηθεί δοκιμαστικά conversion από τις αρχές Νοεμβρίου και αφού είχαμε ξεπεράσει τα σημαντικότερα προβλήματα ήμασταν πλέον έτοιμοι για τη μετατροπή. Έγιναν τα σχετικά backup, εγκαταστάθηκε το νέο VSS στον server (στους clients είχε εγκατασταθεί εδώ και μέρες και το δουλεύαμε μαζί με το παλιό studio, είναι μια χαρά) και έγινε analyze και fix της βάσης. Η διαφορά με τα δοκιμαστικά conversion που είχα κάνει ήταν ότι στις δοκιμές χρησιμοποιούσα disconnected αρχεία από το vss, ενώ τώρα έκανα branch όλο το solution, read only το παλιό branch για ασφάλεια, και έπαιζα connected. Η μετατροπή έγινε project - project, ξεκινώντας από τα χαμηλότερα ιεραρχικά και ανεβαίνοντας προς τα πάνω. Μετά από κάθε project που έμπαινε μέσα, πήγαινα στα properties και και το ρύθμιζα έτσι ώστε να μην εμφανίζει καθόλου warnings και να μην κάνει include xml coments στα builds, γιατί είχα υποψιαστεί ότι αυτά καθυστερούν πολύ το studio....
|
-
|
Ο Ζαχαρίας και όλο το υπόλοιπο team κατεβάζουν περίπτερο σε έκθεση τεχνολογίας! Ναι, ναι. Και η Τούλα. Και όχι, ο ήρωας της βραδιάς δεν είναι η Τούλα όπως ίσως να υποθέτετε. Οι εκθέσεις τεχνολογίας κρύβουν εκπληκτικά εκπληκτικές εκπλήξεις κάποιες φορές. (Νομίζω οτι χρησιμοποιώ εκπληκτικά πολύ τη λέξη "εκπληκτικά"). Διαβάστε το. Θα εκπλαγείτε. Εκπληκτικά....
|
-
|
Ο SQL Server 2005 έχει πολλά νέα χαρακτηριστικά. Πολλά από αυτά είναι εμφανή, πολλά άλλα είναι κάτω από το καπό. Μερικά από αυτά είναι τόσο σημαντικά, που ακόμη δεν έχουμε συλλάβει τις αλλαγές που σηματοδοτούν στον τρόπο που γράφουμε εφαρμογές σήμερα. Ένα τέτοιο χαρακτηριστικό είναι η δυνατότητα να γράφουμε κώδικα σε οποιαδήποτε γλώσσα προγραμματισμού δουλεύει στο .NET CLR, εκεί που μέχρι σήμερα δεσμευόμασταν με την T-SQL. Κατά την ταπεινή μου γνώμη μου είναι το σημαντικότερο χαρακτηριστικό του SQL Server 2005. Το θέμα έχει πολύ background και πολλά θεωρητικά για να συζητήσουμε, ωστόσο θα ξεκινήσουμε με ένα απλό παράδειγμα και πάνω σε αυτό μπορούμε να επεκταθούμε. Θα φτιάξουμε ένα UDF χρησιμοποιώντας VB.NET. Μπορούμε να ξεκινήσουμε το Visual Studio 2005 και με New Project, επιλέγουμε τη γλώσσα προτίμησης και στην ομάδα Database, επιλέγουμε SQL Server Project. Δίνουμε το κατάλληλο όνομα στο project και κατόπιν εμφανίζεται ένα παράθυρο με το οποίο επιλέγουμε ένα Database Reference (αν δεν έχουμε κανένα, τότε εμφανίζεται...
|
-
|
Επιτέλους! Το error handling πάντα ήταν ένα από τα αδύνατα σημεία της T-SQL. Πλέον στη νέα έκδοση του SQL Server υποστηρίζεται η δομή Try…Catch! Ας δούμε ένα παράδειγμα: SET tempdb GO CREATE TABLE DemoTable (ColumnA int PRIMARY KEY , ColumnB int ) CREATE TABLE LogTable (ColumnA int , ColumnB int , error int , date datetime default GETDATE ()) GO CREATE PROCEDURE DoSomething @a int , @b int AS SET XACT_ABORT ON BEGIN TRY BEGIN TRAN INSERT INTO DemoTable VALUES (@a, @b) COMMIT TRAN END TRY BEGIN CATCH DECLARE @err int SET @err = @@error ROLLBACK TRAN INSERT INTO LogTable VALUES (@a, @b, @err, default ) END CATCH GO EXEC DoSomething 1,1 EXEC DoSomething 2,2 EXEC DoSomething 3,3 EXEC DoSomething 1,1 SELECT * FROM LogTable Μέσα στην procedure, θα παρατηρήσετε ότι η δομή Try…Catch σπάει δε δύο τμήματα. Το πρώτο είναι το BEGIN TRY…END TRY block και το δεύτερο είναι το BEGIN CATCH…END CATCH block. Εντούτοις, αυτά τα δύο αποτελούν μία οντότητα και δεν μπορούν να διαχωριστούν (πχ το πρώτο να είναι σε μια stored procedure...
|
-
|
Το συγκεκριμένο γράφτηκε με αφορμή το Visual Studio 2005 / Sql Server 2005 / Biztalk 2006 Launch Event που έγινε στο Γαλάτσι στις 6/12/2005. Αν το διαβάζετε τώρα, χάσατε! ΤΙ ΚΑΝΑΤΕ ΤΟΣΟ ΚΑΙΡΟ; Τελος παντων, ακόμα και να μην ήρθατε (κριμα, θα γνωρίζατε και το...Ζαχαρία), διαβάστε το. Περιλαμβάνει βιαιες σκηνές εναντιον Project Managers, οπότε δεν συστήνεται για ηλικίες κάτω των 18....
|
-
|
Πολλές φορές έχουμε να αντιμετωπίσουμε requests του τύπου «θέλω όλες τις σημερινές παραγγελίες ταξινομημένες κατά ώρα αλλά με μία πρώτη στήλη extra που να έχει αύξοντα αρίθμηση». Εφόσον εκείνη την ώρα δεν χτυπήσει ο κεραυνός του Codd τον βάρβαρο που τόλμησε να ξεστομίσει τέτοιο πράγμα, εμείς θα πρέπει να το ικανοποιήσουμε. Για να πούμε την αλήθεια, η πρακτική αξία της δυνατότητας να μπορεί να παράγει κανείς row numbers είναι μεγάλη. Φανταστείτε για παράδειγμα πόσο πιο απλός θα ήταν ο κώδικας για την υλοποίηση paging tables σε web-pages αν είχαμε αυτή τη δυνατότητα. Μέχρι σήμερα, για να φτιάξουμε κάτι τέτοιο, θα έπρεπε να καταφύγουμε σε διάφορες τεχνικές. Κάποιος θα μπορούσε να σκαρώσει γρήγορα-γρήγορα ένα query του τύπου: SELECT ( SELECT COUNT (*) FROM Orders AS O2 WHERE O2.orderid <= O1.orderid) AS rownum, orderid, orderdate FROM Orders AS O1 ORDER BY orderid το οποίο είναι τρομερά inefficient καθώς για κάθε εγγραφή, κάνει ένα ξεχωριστό query προκειμένου να βρει τον αριθμό της (περισσότερα τέτοια εδώ ). Άλλοι,...
|
-
|
Από το άρθρο του Jackie Goldstein στο MSDN, New DataSet Features in Visual Studio 2005 , συνοψίζω αυτά που θεωρώ σημαντικότερα: Πηγές δεδομένων (Data sources) Από αντικείμενο: Οποιοδήποτε αντικείμενο με public properties μπορεί να αποτελεί πηγή δεδομένων για ένα dataset χωρίς να χρειάζεται να υλοποιήσουμε κάποιο ειδικό interface. Από web service: Μπορούμε να δημιουργήσουμε και να δέσουμε ένα dataset από τα δεδομένα που έρχονται από ένα web service Και στις δύο αυτές περιπτώσεις, όπως και στις παλιότερες κλασσικές, το dataset που δημιουργείται είναι το ίδιο και το χειριζόμαστε με τον ίδιο τρόπο. Typed datasets και TableAdapter Ο Table adapter είναι στην ουσία ένας Typed DataAdapter με την ίδια αντιστοιχία DataSet και TypedDataSet. Επιπλέον, ο TableAdapter μπορεί να φορτωθεί με πολλές διαφορετικές μεθόδους για το γέμισμα του πίνακα στον οποίον αντιστοιχεί. Έτσι μπορεί να έχει πάνω του methods όπως FillByCountryAndCity και FillByID ταυτόχρονα (χωρίς να χρειάζεται να δημιουργούμε ξεχωριστούς dataAdapters όπως παλιά)...
|
-
|
Ένας από τους κυριότερους λόγους που πολλοί developers καταφεύγουν στους cursors όταν γράφουν T-SQL κώδικα είναι η αδυναμία να σκεφτούν τη λύση του προβλήματος με set-oriented τρόπο. Μια κλασική περίπτωση που συμβαίνει αυτό είναι το «θέλω για κάθε εγγραφή από τον πίνακα Χ να συμβαίνει κάτι στο πίνακα Υ». Ο APPLY operator είναι ένας νέος relational operator που έρχεται να βοηθήσει όταν αντιμετωπίζουμε τέτοια προβλήματα, ώστε να μην χρειαστεί να καταφύγουμε σε cursors. Χρησιμοποιείται στο FROM clause και μας επιτρέπει να εφαρμόσουμε ένα table expression για κάθε εγγραφή του εξωτερικού πίνακα, όπου table expression μπορεί να είναι ένα view, ένας πίνακας ή ένα table function. Ας δούμε ένα παράδειγμα: Θέλουμε ένα report όπου για κάθε κατηγορία προϊόντων θα εμφανίζονται τα 3 πιο ακριβά προϊόντα. Αρχικά, ορίζουμε το table function το οποίο έχει ως παράμετρο το CategoryID και βάσει αυτού φέρνει με TOP(3) τα τρία ακριβότερα προϊόντα. CREATE FUNCTION MostExpensiveProducts(@CatID int ) RETURNS TABLE AS RETURN SELECT TOP...
|
-
|
As I was developing applications for .Net Framework 1.0 and 1.1, I was building a couple of code libraries with features I found smart and useful for my apps. Being an active member of dotNetZone.gr, (a Greek .net developer community often nicknamed DNZ), I recently decided to share some of that code with others in DNZ. The idea was to do that while porting the code to .Net Framework 2.0 through Visual Studio 2005. Now, what’s so funny about that? First thing I wanted to share was my Wizard classes. I implemented them in the context of a web project and used to find them brilliant. Using SourceSafe Ι started today pinning and branching code to a new VS 2005 solution that would contain the part of my libraries related to Wizards. “Come on! Where is the funny part?” you would still ask! Well I compiled it and got the following compile time errors: Error1: 'Wizard' is an ambiguous reference between 'System.Web.UI.WebControls.Wizard' and 'Softbone.Shared.Wizards.Wizard' Error 2: 'WizardStep' is an ambiguous reference...
|
-
|
Common Table Expressions Τα Common Table Expressions (CTEs) είναι ένα νέο χαρακτηριστικό της T-SQL το οποίο καθορίζεται στο SQL-99 πρότυπο. Τι είναι αυτά; Είναι ο τρόπος με τον οποίο καθορίζουμε προσωρινά result sets μέσα σε ένα statement. Φέρτε στο μυαλό σας τα derived και temporary tables… Ε, κάτι παρόμοιο αλλά όχι ακριβώς το ίδιο όπως θα δούμε παρακάτω. Συνήθως χρησιμοποιούνται για δύο λόγους. Προκειμένου να απλουστεύσουμε τη δομή περίπλοκων queries (εντάξει, αυτό δεν μας ενδιαφέρει γιατί δεν έχουμε πρόβλημα με τα περίπλοκα queries) αλλά και προκειμένου να μπορούμε να υλοποιήσουμε εύκολα αναδρομικά (recursive) queries! Η σύνταξη ενός CTE έχει ως εξής: [ WITH <common_table_expression> [,...n] ] <common_table_expression>::= expression_name [(column_name [,...n])] AS (<CTE_query_definition>) Βέβαια, είναι κομματάκι δύσκολο να αντιληφθεί κανείς αμέσως περί τίνος πρόκειται, γι αυτό ας δούμε ένα παράδειγμα: WITH TopOrders (ProductID, TotQty) AS ( SELECT ProductID, Sum (Quantity) FROM [ Order Details]...
|
-
|
Αν έχετε γράψει κώδικα για triggers θα ξέρετε τους ψευδοπίνακες Inserted και Deleted μέσω των οποίων μπορεί κανείς να αποκτήσει πρόσβαση στις τιμές των rows που γίνονται INSERT, UPDATE ή DELETE, ακριβώς πριν να ολοκληρωθεί η διαδικασία. Για παράδειγμα, ένα τυπικό πρόβλημα που θα έπρεπε να χρησιμοποιήσουμε triggers, είναι όταν αλλάζουμε την τιμή όλων των προϊόντων που ανήκουν σε μια κατηγορία και το ζητούμενο είναι να καταγράφουμε σε έναν πίνακα την προηγούμενη τιμή, τη νέα τιμή, την ημέρα και ώρα της αλλαγής και τον χρήστη που κάνει την αλλαγή. Εναλλακτικά, αν δεν θέλουμε να χρησιμοποιήσουμε triggers, θα πρέπει να γράψουμε μια μακροσκελή stored procedure η οποία θα κάνει ένα iteration σε όλες τις εγγραφές, θα κάνει ένα-ένα τα UPDATE που θα ακολουθούνται από ένα INSERT στο logging πίνακα (Χωρίς cursors ε! Με τον άλλον τρόπο, τον καλό, με while loop). Στον SQL Server 2005 μπορούμε να χρησιμοποιήσουμε το keyword OUTPUT το οποίο μπαίνει στα INSERT, UPDATE και DELETE statements και μας δίνει πρόσβαση στους πίνακες...
|
|
|
|