Αναζήτηση εγγραφής σε SQL με πληκτρολόγηση ελληνικών και λατινικών χαρακτήρων.

Δημοσιεύτηκε στις Τετάρτη, 29 Ιουλίου 2009 2:01 μμ από το μέλος imanos :: 0 σχόλια
Καταχώρηση στις κατηγορίες:

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

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

Π.Χ. Θέλουμε να ψάξουμε στον πίνακα Products για τα προϊόντα που περιέχουν στην περιγραφή τους την λέξη αδιαβροχο.

Θα γράφαμε select * from Products where ProductName like '%αδιαβροχο%' και φυσικά θα μας επέστρεφε τα προϊόντα για τα οποία έτρεξε το select.

Τι θα γινόταν όμως αν γράφαμε το εξής select * from Products where ProductName like '%Adiaβροχο%' . Φυσικά και δεν θα μας επέστρεφε τίποτα.

Παρακάτω θα σας δώσω μία sql function η οποία κάνει εφικτό το παραπάνω search

GO
/****** Object:  UserDefinedFunction [dbo].[SearchAny]    Script Date: 07/29/2009 14:21:12 ******/
IF  EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[SearchAny]') AND xtype in (N'FN', N'IF', N'TF'))
DROP FUNCTION [dbo].[SearchAny]
GO
/****** Object:  UserDefinedFunction [dbo].[SearchAny]    Script Date: 07/29/2009 14:21:38 ******/
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO

CREATE FUNCTION [dbo].[SearchAny](@value varchar(8000)) RETURNS varchar(8000)  
AS  
BEGIN  
 DECLARE   @i  int,  
		   @length  int,  
		   @character  char(1),  
		   @newValue  varchar(8000)  
  
 IF ISNULL(@value, '') = '' RETURN ''  
  
 -- Αντικατάσταση των διφθόγγων  ελληνικά,αγγλικά
 SET @value = REPLACE(@value, 'οι', 'I')  
 SET @value = REPLACE(@value, 'ει', 'I')  
 SET @value = REPLACE(@value, 'αι', 'E')  
 

 SET @value = REPLACE(@value, 'oi', 'I')  
 SET @value = REPLACE(@value, 'ei', 'I')  
 SET @value = REPLACE(@value, 'ai', 'E')  
  

 SET @value = REPLACE(@value, 'ου', 'U')  
 SET @value = REPLACE(@value, 'ou', 'U')  
  
 SET @value = REPLACE(@value, 'th', 'U') -- Ελληνικό θήτα 
  
 SELECT @length = LEN(@value), @newValue = ''  
  
 SET @i = 1  
 WHILE @i <= @length  
 BEGIN  
  SET @character = SUBSTRING(@value, @i, 1)  

----Ανάθεση χαρακτήρα  
  IF  @character IN ('Α', 'Ά', 'α', 'ά') SET @character= 'A'  
  ELSE IF @character IN ('Β', 'β')  SET @character= 'B'  
  ELSE IF @character IN ('Γ', 'γ')  SET @character= 'G'  
  ELSE IF @character IN ('Δ', 'δ')  SET @character= 'D'  
  ELSE IF @character IN ('Ε', 'ε', 'Έ', 'έ') SET @character= 'E'  
  ELSE IF @character IN ('Ζ', 'ζ')  SET @character= 'Z'  
  ELSE IF @character IN ('Η', 'η', 'Ή', 'ή', 'Υ', 'υ', 'Ύ', 'ύ', 'Ϋ', 'ϋ', 'Ι', 'ι', 'Ί', 'ί', 'Ϊ', 'ϊ', 'Y', 'y', 'H', 'h')  SET @character= 'I'  
  ELSE IF @character IN ('Θ', 'θ')  SET @character= 'U'  
  ELSE IF @character IN ('Κ', 'κ')  SET @character= 'K'  
  ELSE IF @character IN ('Λ', 'λ')  SET @character= 'L'  
  ELSE IF @character IN ('Μ', 'μ')  SET @character= 'M'  
  ELSE IF @character IN ('Ν', 'ν')  SET @character= 'N'  
  ELSE IF @character IN ('Ξ', 'ξ')  SET @character= 'J'  
  ELSE IF @character IN ('Ο', 'ο', 'Ό', 'ό', 'Ω', 'ω', 'Ώ', 'ώ')  SET @character= 'O'  
  ELSE IF @character IN ('Π', 'π')  SET @character= 'P'  
  ELSE IF @character IN ('Ρ', 'ρ')  SET @character= 'R'  
  ELSE IF @character IN ('Σ', 'σ', 'ς') SET @character= 'S'  
  ELSE IF @character IN ('Τ', 'τ')  SET @character= 'T'  
  ELSE IF @character IN ('Φ', 'φ')  SET @character= 'F'  
  ELSE IF @character IN ('Χ', 'χ')  SET @character= 'X'  
  ELSE IF @character IN ('Ψ', 'ψ')  SET @character= 'C'  
  ELSE IF @character IN ('.')   SET @character= '%'  
  
  --Δημιουργία λέξης
  SET @newValue = @newValue + @character 
  SET @i = @i + 1  
 END  
  
 RETURN UPPER(@newValue)  
END  
Τώρα χρησιμοποιώνας στο select statement την παραπάνω function το select θα μου επιστρέψει δεδομένα
select * from Products where UPPER(dbo.SearchAny(ProductName)) like '%'+dbo.SearchAny('Adiaβροχο')+'%'
Ελπίζω η παραπάνω συνάρτηση να βοηθήσει .Επίσης οποιαδήποτε παρατήρηση ,διόρθωση και βελτίωση του παραπάνω κώδικα είναι καλοδεχούμενη.
 

Βάσεις σε SQL Server με διαφορετικό COLLATION και σύνδεση πινάκων μεταξύ τους σε QUERY

Δημοσιεύτηκε στις Τρίτη, 31 Μαρτίου 2009 8:25 πμ από το μέλος imanos :: 0 σχόλια
Καταχώρηση στις κατηγορίες:
Έχουμε εγκατεστημένο έναν SQL SERVER με COLLATION GREEK_CI_AS
Σε αυτόν υπάρχουν εγκατεστημένες δύο βάσεις η μία myFirst_db 
με το default COLLATION του SQL SERVER και η mySecond_db άλλη 
μέ COLLATION GREEK_CI_AI
Στις δύο βάσεις υπάρχουν δύο ομοιοι πίνακες Products όπως παρακάτω
Πίνακας Products (
	                ProductId int,
                         PartDescription varchar(60),		  
                         Category varchar(10),
                         UnitOfMeassure varchar(10),
                         UnitPrice numeric(28,6)
   	        )

Αν τώρα γράφαμε ένα query ώστε να πάρουμε ένα union και τον δύο πινάκων .

use myFirst_db

GO

select ProductId,PartDescription,Category,UnitOfMeassure,UnitPrice from Products

union all

select ProductId,PartDescription,Category,UnitOfMeassure,UnitPrice from mySecond_db..Products

θα είχαμε το παρακάτω αποτέλεσμα

Msg 457, Level 16, State 1, Line 1

Implicit conversion of varchar value to varchar cannot be performed because the collation of the value is unresolved due to a collation conflict.

Ο τρόπος που μπορούμε να αποφύγουμε το παρακάτω λάθος είναι να δηλώσουμε στο Query και συγκεκριμμένα στα αλφαριθμητικά πεδία το COLLATION που έχει η βάση που κάνουμε use δηλ. το Query θα πρέπει να διαμορφωθεί όπως παρακάτω.

----η myFirst_db έχει COLLATION GREEK_CI_AS

use myFirst_db

GO

select ProductId,PartDescription,Category,UnitOfMeassure,UnitPrice from Products

union all

select ProductId,PartDescription COLLATE GREEK_CI_AS ,Category COLLATE GREEK_CI_AS ,UnitOfMeassure COLLATE GREEK_CI_AS ,UnitPrice from mySecond_db..Products

Ελπίζω το παραπάνω να φανεί χρήσιμο σε κάποιους από την κοινότητα το dotnetzone.

 

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

Δημοσιεύτηκε στις Τρίτη, 13 Μαΐου 2008 12:07 μμ από το μέλος imanos :: 2 σχόλια
Καταχώρηση στις κατηγορίες:

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

sp_MSforeachtable 'sp_changeobjectowner ''?'',''τοΟνομαΤουΝεουOwnerΕδω'''

Πώς μπορούμε να παγιδεύσουμε το event κάνουμε κλικ πάνω στο Title Bar μιας φόρμας.

Δημοσιεύτηκε στις Παρασκευή, 12 Οκτωβρίου 2007 8:39 πμ από το μέλος imanos :: 0 σχόλια
Καταχώρηση στις κατηγορίες:

Εντοπισμός του αριστερού κλικ του ποντικιού πάνω στο TITLE BAR μιας φόρμας και εκμετάλευση του Opacity έτσι ώστε όταν μετακινούμε την φόρμα αυτή να συμπεριφέρεται όπως στα Windows Vista.

Private Const WIN_MOUSEBUTTONDOWN As Long = &HA1
Private Const WIN_MOUSEBUTTONUP As Long = &HA0
Protected Overrides Sub DefWndProc(ByRef m As System.Windows.Forms.Message)
' -- Εντοπισμός του αριστερού κλικ του ποντικιού στό Title Bar της φόρμας
If CLng(m.Msg) = WIN_MOUSEBUTTONDOWN Then
' -- Ορίζουμε το opacity της Φόρμας
If Me.Opacity <> 0.8 Then Me.Opacity = 0.8
' --Εντοπισμός του όταν αφήνουμε το αριστερό κλικ του pontikio;y
ElseIf CLng(m.Msg) = WIN_MOUSEBUTTONUP Then
If Me.Opacity <> 1.0 Then Me.Opacity = 1.0
End If
' -- Συνήθης Λειτουργικότητα
MyBase.DefWndProc(m)
End Sub

 

Default Trace in SQL Server 2005

Δημοσιεύτηκε στις Παρασκευή, 17 Νοεμβρίου 2006 9:04 πμ από το μέλος imanos :: 0 σχόλια
Καταχώρηση στις κατηγορίες:

Στό Email μου ήρθε για ενημέρωσή μου το παρακάτω κείμενο το οποίο και σας  παραθέτω .Πιστεύω ότι είναι αρκετά ενδιαφέρον

Problem
I have been running SQL Server 2005 server side traces to address some SQL Server 2005 performance issues.  I have noticed an unusual trace session that is running.  I know I have not been running this trace and know I have been diligent about running only a single trace to not impact performance.  So where did this trace session coming from?

Solution
SQL Server 2005 is running a default trace.  You can think of this as a replacement to the black box mode trace that could have been run in SQL Server 2000 where the last 5 MB of data is captured.  The trace's impact should be minimal to the server, but is valuable to be aware of as a DBA or Developer responsible for the server.

How can I find out if the trace is running on my SQL Server?

The simplest means to determine if the trace is running is to execute the following command:

SELECT *
FROM fn_trace_getinfo(default);
GO

What does the output indicate?

Result Set Description
Traceid Unique identifier for the trace
Property = 1 Configured trace options
Property = 2 Trace file name
Property = 3 Max file size for the *.trc file
Property = 4 Stop time for the trace session
Property = 5 Current trace status (1 = On and 0 = Off)
Value Current value for the traceid\property combination

Where is this trace file stored by default?

The trace is stored in the LOG directory for your SQL Server instance (i.e. C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG\) at the root of where your SQL Server is installed.

Another alternative to determine if the trace is running is to review sp_configure.

To determine if the trace is configured to run, execute sp_configure and review the 'default trace enabled' option.  When the config_value and run_value are equal to 1, then this trace is running. 

How can I disable this default trace?

To disable the default trace from running, issue the following commands:

EXEC master.dbo.sp_configure 'allow updates', 1;
GO
EXEC master.dbo.sp_configure 'show advanced options', 1;
GO
EXEC master.dbo.sp_configure 'default trace enabled', 0;
GO
RECONFIGURE WITH OVERRIDE;
GO
EXEC master.dbo.sp_configure 'show advanced options', 0;
GO
EXEC master.dbo.sp_configure 'allow updates', 0;
GO

*** NOTE *** - When you issue these commands, the trace stops executing immediately.

Should I disable this trace?

If you were not aware of this trace running and you were not having related or suspected performance issues from this trace, I would say maybe not.  The final answer should come after reviewing the output from the trace files to determine if the data is valuable to you.  Invaluable information like login creations and drops are captured in these files.  You might also find other jewels that may answer some recent outstanding questions.  If the value of the information exceeds the potential issue from running this trace, then it should remain enabled.  I also encourage you to consider this trace as a source when troubleshooting an issue, so consider reviewing this file the next time a question goes unanswered.

How can I review the data captured in the trace files?

Let's end on an easy question.  Just navigate to the directory where the files are located i.e. C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG\ and double click on the files.  Profiler should load and permit you to browse the contents interactively.

Διαγραφή διπλών εγγραφών στον SQL2005 σε πίνακα χωρίς Primary Key

Δημοσιεύτηκε στις Δευτέρα, 13 Νοεμβρίου 2006 8:41 πμ από το μέλος imanos :: 0 σχόλια
Καταχώρηση στις κατηγορίες:

Μέχρι τώρα στον για να διαγράψουμε διπλές εγγραφές σέ ένα πίνακα που δέν έχει Primary Key χρησιμοποιούσαμε την SET ROWCOUNT 1

Δηλαδή κάναμε το παρακάτω .

SET ROWCOUNT 1

Delete myTableName where ID=1

SET ROWCOUNT 0

Αυτό συνεχίζει να ισχύει και στον SQL2005 αλλά μπορεί να γίνει χρησιμοποιώντας και την TOP

DELETE TOP(1FROM myTableName  WHERE ID 1

Γιατί θα μου πείτε πρέπει να χρησιμοποιούμε την TOP και όχι την ROWCOUNT  η απάντηση έρχεται από την ίδια την Microsoft όπως φαίνεται παρακάτω.

 

Using SET ROWCOUNT will not affect DELETE, INSERT, and UPDATE statements in the next release of SQL Server. Avoid using SET ROWCOUNT together with DELETE, INSERT, and UPDATE statements in new development work, and plan to modify applications that currently use it. Also, for DELETE, INSERT, and UPDATE statements that currently use SET ROWCOUNT, we recommend that you rewrite them to use the TOP syntax.

 

BACKUP IN SQL WITH PASSWORD PROTECTION

Δημοσιεύτηκε στις Πέμπτη, 9 Νοεμβρίου 2006 2:25 μμ από το μέλος imanos :: 0 σχόλια
Καταχώρηση στις κατηγορίες:

Ο μόνος τρόπος για να πάρουμε Backup στόν SQL SERVER το οποίο να προστατεύεται μέ χρήση password είναι μέσω της T-SQL . Παρακέτω παραθέτω πώς αυτό μπορεί να γίνει.

Εντολή Backup

BACKUP DATABASE Northwind TO DISK='C:\Northwind.BAK' WITH MEDIAPASSWORD='3$56#$21'

Παρακάτω βλέπουμε πώς οι εντολές για Restore χωρίς την χρήση το password που χρησιμοποιήσαμε μάς επιστρέφουν μυνήματα λάθους.

                                    RESTORE FILELISTONLY FROM DISK='C:\Northwind.BAK'

                                    RESTORE HEADERONLY FROM DISK='C:\Northwind.BAK'

                                    RESTORE VERIFYONLY FROM DISK='C:\Northwind.BAK'

                                    RESTORE DATABASE Northwind FROM DISK='C:\Northwind.BAK'

Άν τώρα ορίσουμε το password σέ οποιαδήποτε από της παρακάτω εντολές restore τότε το Restore είναι εφικτό.

RESTORE FILELISTONLY FROM DISK='C:\Northwind.BAK' WITH MEDIAPASSWORD='3$56#$21'
RESTORE HEADERONLY FROM DISK='C:\Northwind.BAK' WITH MEDIAPASSWORD='3$56#$21'
RESTORE VERIFYONLY FROM DISK='C:\Northwind.BAK' WITH MEDIAPASSWORD='3$56#$21'
RESTORE DATABASE 
Northwind FROM DISK='C:\Northwind.BAK' WITH MEDIAPASSWORD='3$56#$21'

Αν προσπαθήσουμε να κάνουμε Restore από τα εργαλεία του Enterprise Manager τότε θα πάρουμε μύνημα λάθους γιατί δέν υποστηρίζεται ή διαδικασία σε paswword protected Backups.

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

 

 

Procedure στον SQL Server για αποστολή Mail

Δημοσιεύτηκε στις Τετάρτη, 25 Οκτωβρίου 2006 1:48 μμ από το μέλος imanos :: 2 σχόλια
Καταχώρηση στις κατηγορίες:

Παρακάτω παραθέτω μία procedure που μπορούμε να χρησιμοποιήσουμε για αποστολή Anonymous Email μέσω SMTP από τον SQL Server 2000

Προσοχή ο χρήστης πρέπει να έχει στην master δικαιώματα στίς παρακάτω procedures του SQL ή να είναι μέλος του sysadmin ή κάποιου άλλου group που του έχουμε δώσει δικαιώματα εκτέλεσης στις procedure.

Procedures SQL : sp_OACreate ,sp_OASetProperty ,sp_OADestroy ,sp_OAGetErrorInfo

Επίσης στό σημείο που δηλώνουμε τον SMTP SERVER αλλάζουμε το SERVERNAME μέ τό όνομα του δικού μας SERVER

CREATE PROCEDURE Smtp_SendMail_sp
(
@MailFrom as nvarchar(50),
@MailTo as nvarchar(50),
@MailSubject as nvarchar(255),
@MailBody as text
)
AS

-- Declare
DECLARE @msg int
DECLARE @config int
DECLARE @bo int
DECLARE @src varchar(255), @desc varchar(255)


/* Δημιουργία του message object */
EXEC @bo = sp_OACreate 'CDO.Message', @msg OUT
/* Δημιουργία του configuration object */
EXEC @bo = sp_OACreate 'CDO.Configuration', @config OUT

/* Configuration Object */
-- Αποστολή μυνήματος χρησιμοποιώντας τό ίκτυο
EXEC @bo = sp_OASetProperty @config, 'Fields(cdoSendUsingMethod)', 'cdoSendUsingPort'
-- Δήλωση του SMTP Server
EXEC @bo = sp_OASetProperty @config, 'Fields(cdoSMTPServer)', 'SERVERNAME'
-- Server SMTP Port
EXEC @bo = sp_OASetProperty @config, 'Fields(cdoSMTPServerPort)', 25
-- Anonymous SMTP Authenticate
EXEC @bo = sp_OASetProperty @config, 'Fields(cdoSMTPAuthenticate)', 'cdoAnonymous'
EXEC sp_OAMethod @config, 'Fields.Update'

/* Message Object */
EXEC @bo = sp_OASetProperty @msg, 'Configuration', @config -- set message.configuration = config
EXEC @bo = sp_OASetProperty @msg, 'To', @MailTo
EXEC @bo = sp_OASetProperty @msg, 'From', @MailFrom
EXEC @bo = sp_OASetProperty @msg, 'Subject', @MailSubject
EXEC @bo = sp_OASetProperty @msg, 'TextBody', @MailBody
EXEC sp_OAMethod @msg, 'Send()'

/* Καταστροφή τών objects */
EXEC @bo = sp_OADestroy @msg
EXEC @bo = sp_OADestroy @config

-- Χειρισμός Λαθών
IF @bo <> 0
BEGIN
EXEC sp_OAGetErrorInfo @msg, @src OUT, @desc OUT
SELECT convert(varbinary(4),@bo) as ErrNo, @src as Source, @desc as Description
RETURN
END

---Τρόπος Εκτέλεσης

  EXEC sp_SMTPemail '[email protected]', '[email protected]', 'Το Θέμα μου','Θα συναντηθούμε στο καφενείο του DotnetZone'

  Ελπίζω να φανεί χρήσιμο σέ κάποιους .

 

 

Μια UDF η οποία μας επιστρέφει της εργάσιμες μέρες μεταξύ δύο ημερομηνιών.

Δημοσιεύτηκε στις Πέμπτη, 21 Σεπτεμβρίου 2006 10:42 πμ από το μέλος imanos :: 0 σχόλια
Καταχώρηση στις κατηγορίες:

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

Βήμα 1.

Δημιουργία ενός πίνακα στον οποίο εισάγουμε της Επίσημες αργίες όχι (Σάββατα-Κυριακές)

CREATE TABLE Public_Holidays
 (
         pubHoliday datetime NOT NULL
 )

go

insert into Public_Holidays values('2006-10-28')

insert into Public_Holidays values('2006-12-25') 

κ.λ.π.

Βήμα 2

Δημιουργία της UDF

CREATE FUNCTION fn_Wrk_days_Between (@FromDay datetime, @UntilDay datetime)
RETURNS int
AS
BEGIN
 
declare @day1 datetime,@day2 datetime,@tmpday datetime,@day int,@count int,@polaplasiastis int

/*
 Έλεγχος άν η ημερομηνία από είναι μεγαλύτερη από την ημερομηνία έως
 Αν η ημερομηνία από είναι μικρότερη από την έως περνάμε ανάποδα της παραμέτρους
 και δηλώνουμε τον πολλαπλασιαστή μέ -1 έτσι ώστε να μας επιστραφούν ή ημέρες εργασίας αρνητικά.
*/
if @FromDay < @UntilDay
 Begin
        set @day1 = CONVERT(datetime ,(CONVERT(char(10),@FromDay,102)),102 )
        set @day2 = CONVERT(datetime ,(CONVERT(char(10),@UntilDay,102)),102 )
        set @polaplasiastis=1
 End
Else
 Begin
        set @day2 = CONVERT(datetime ,(CONVERT(char(10),@FromDay,102)),102 )
        set @day1 = CONVERT(datetime ,(CONVERT(char(10),@UntilDay,102)),102 )
        set @polaplasiastis=-1
 End

set @tmpday = @day1
set @count = 0

/* Εκτέλεση μέχρι η προσωρινή ημερομηνία γίνει ίση μέ την day2 */
while ( datediff(dd,@tmpday,@day2) >= 0)
begin
Select @day = Datepart(dw,@tmpday)
        /* Αν δέν είναι Σάββατο και Κυριακή */
if (@day != 1 AND @day != 7)
        /* Αν δέν βρίσκεται στον πίνακα Αργιών */
 if not exists(Select * From Public_Holidays where pubHoliday= @tmpday)
        /* Αύξηση της @tmpday ανά μία(1) */
        Select @count = @count + 1
       
Select @tmpday = Dateadd(dd,1,@tmpday)
end

/* Επιστροφή ημερών εργασίας */

Return @count * @polaplasiastis
END

Βήμα 3

Επαλήθευση της UDF

select dbo.fn_Wrk_days_Between('2006-10-23','2006-10-29')

-----------
5

select dbo.fn_Wrk_days_Between('2006-12-25','2006-12-31')

-----------
4

Εύρεση εργασίμων ημερών όταν η ημερομηνία από είναι μεγαλύτερη από την έως

select dbo.fn_Wrk_days_Between('2006-12-25','2006-12-18')

-----------
-5

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

Ελπίζω το παραπάνω κομμάτι κώδικα νά σας βοηθήσει .

 

Πώς μπορούμε να ενώσουμε σέ ένα query τα αποτελέσματα μίας sp μέ ένα πίνακα.

Δημοσιεύτηκε στις Δευτέρα, 18 Σεπτεμβρίου 2006 3:19 πμ από το μέλος imanos :: 0 σχόλια
Καταχώρηση στις κατηγορίες:

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

use pubs

go

EXEC sp_serveroption 'serverName', 'data access', true

Αντικαθιστούμε το serverName μέ το όνομα του Server μας.

Κατόπιν βλέπουμε την σύνταξη του query .

SELECT *
FROM authors a JOIN openquery([ACUMEN], 'pubs..byroyalty 50') b
ON a.au_id = b.au_id

Νομίζω ότι είναι ένα αρκετά εύκολο και κατατοπιστικό παράδειγμα.

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

Δημοσιεύτηκε στις Πέμπτη, 31 Αυγούστου 2006 8:26 πμ από το μέλος imanos :: 2 σχόλια
Καταχώρηση στις κατηγορίες:

Παρακάτω παραθέτω μία μέθοδο η οποία εάν εκτελεστεί μία φορά μέσα από την εφαρμογή τότε η εφαρμογή ουσιαστικά γίνεται autoRun όταν ξεκινάμε τά Windows

Αρχικά στά Reference πρέπει να δηλώσουμε το Microsoft.VisualBasic.Compatibility

 

Imports Microsoft.Win32

Module AutoRun

Public Sub AddInRun()

Dim Value As String

Dim RegKey As RegistryKey = Registry.LocalMachine.CreateSubKey("Software\Microsoft\Windows\CurrentVersion\Run")

Value = VB6.GetPath & "\" & VB6.GetEXEName() & ".EXE"

RegKey.SetValue("MyApplication", Value)

RegKey.Close()

End Sub

End Module

 

 

Procedure η οποία κάνει enable και disable τα Foreign Keys σέ μια βάση.

Δημοσιεύτηκε στις Τετάρτη, 30 Αυγούστου 2006 9:40 πμ από το μέλος imanos :: 0 σχόλια
Καταχώρηση στις κατηγορίες:

CREATE PROC fk_disable_enable_sp @mode char(8)
AS
    BEGIN
    
      DECLARE @tblname sysname, @constraintname sysname, @execstr varchar(8000)

     DECLARE fk_cur CURSOR FOR
       SELECT '[' + table_name + ']' ,constraint_name
       FROM   information_schema.constraint_table_usage
       WHERE   lower(substring (constraint_name,1,2)) = 'fk'
  
     OPEN fk_cur
     FETCH fk_cur INTO @tblname, @constraintname
      WHILE (@@fetch_status = 0)
       BEGIN
         SET @execstr = 'alter TABLE ' + @tblname + ' ' + @mode + ' CONSTRAINT ' + @constraintname
        PRINT (@execstr)
        EXEC (@execstr)
     FETCH fk_cur INTO @tblname, @constraintname
     END
     CLOSE fk_cur
     DEALLOCATE fk_cur
end
go

----Τρόπος κλήσης της sp

---Για να κάνουμε disable τα FK
exec fk_disable_enable_sp 'nocheck'


---Για να κάνουμε enable τα FK
exec fk_disable_enable_sp 'check'

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

Ο λόγως δημιουργίας αυτής της sp είναι για λόγους maintanance από τον administrator .

 

Δημιουργία custom Shape Form

Δημοσιεύτηκε στις Τετάρτη, 3 Μαΐου 2006 11:36 πμ από το μέλος imanos :: 1 σχόλια
Καταχώρηση στις κατηγορίες:

Στο .NET με πολύ εύκολο τρόπο μπορούμε να δημιουργήσουμε δικά μας Skin για της φόρμες μας

Εδώ Βλέπουμε πώς είναι η κλασική Windows Form

Παρακάτω Βλέπουμε πώς μπορεί νά είναι η δικιά μας φόρμα

Πώς γίνεται τώρα αυτό.

Έχουμε φτιάξει ένα image πού έχει την εμφάνιση πού θέλουμε νά έχει η φόρμα μας και το χρησιμοποιούμε  ώς BackroundImage .της φόρμας μας (Form1).

Κατόπιν χρησιμοπούμε τον παρακάτω κώδικα

#Region "API Declarations"

   Private Declare Sub ReleaseCapture Lib "user32" ()

   Private Declare Sub SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer)

   Private Const WM_NCLBUTTONDOWN As Integer = &HA1

   Private Const HTCAPTION As Integer = 2

#End Region

'Για νά μετακινηθεί η φόρμα

Private Sub frmMain_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown

   If e.Button = MouseButtons.Left Then

      ReleaseCapture()

      SendMessage(Me.Handle.ToInt32, WM_NCLBUTTONDOWN, HTCAPTION, 0&)

   End If

End Sub

Τοποθετούμε ένα pictureBox στην φόρμα μας και βάζουμε τον παρακάτω κώδικα

Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click

'Το picturebox τοποθετείται πάνω από το κουμπί κλεισίματος που έχει σχεδιαστεί στην εικόνα

'το backcolor property δηλώνεται ώς transparent

Me.Dispose()

End Sub

'Κατόπιν βάζουμε στο paint Event τον παρακάτω κώδικα

Private Sub frmMain_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

Dim img As Bitmap = Me.BackgroundImage

img.MakeTransparent(img.GetPixel(0, 0))

End Sub

Μπορούμε βέβαια νά αλλάζουμε δυναμικά το skin της φόρμας μας έχοντας άλλες εικόνες μέ το σχήμα της φόρμα που θέλουμε φορτόνωντας την εικόνα που θέλουμε κάθε φορά από ένα file που την

έχουμε βάλει .

π.χ. Dim img As New Bitmap("filename") αλλαγή στο Paint Event

Επέκταση δυνατοτήτων ενός ComboBox αυτόματο γέμισμα κατα την πληκρολόγηση από το Items Collection

Δημοσιεύτηκε στις Κυριακή, 2 Απριλίου 2006 10:43 πμ από το μέλος imanos :: 0 σχόλια
Καταχώρηση στις κατηγορίες:

Το πρώτο βήμα που πρέπει να κάνουμε είναι να κάνουμε add ένα User Control στην εφαρμογή μας .Ας το ονομάσουμε myCombo.vb

Κατόπιν μέσα στον κώδικα του user control αντικαθιστούμε το

Inherits System.Windows.Forms.UserControl μέ  Inherits System.Windows.Forms.ComboBox

Θα χρησιμοποιήσουμε δύο μεθόδους της βασικής κλάσης του combobox την MyBase.KeyUp και την MyBase.Leave

Οπότε ο κώδικας έχει ως εξής

Public Class myCombo

Inherits System.Windows.Forms.ComboBox

Private Sub myCombo_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyUp

Dim Typed As String 'Το πληκτρολογηθέν κείμενο

Dim FoundIndex As Integer 'Θέση του κειμένου στό Items Collection

Dim FoundItem As Object 'Το αντικείμενο που βρέθηκε στο Items Collection

Dim FoundText As String 'Το κείμενο του αντικειμένου

Dim AppendText As String 'Το κείμενο που βρίσκεται μετά το σημείο του πληκτρολογηθέντος κειμένου

  Select Case e.KeyCode

   Case Keys.Back, Keys.Left, Keys.Right, Keys.Up, Keys.Down, Keys.Delete, Keys.CapsLock, Keys.Shift, Keys.Home, Keys.ShiftKey

    Return

  End Select

  Typed = Me.Text

  If Trim(Typed) = "" Then

    Return

  End If

 FoundIndex = Me.FindString(Typed) 'Θέση του πληκτρολογηθέντος κειμένου μέσα στο Items Collection

If FoundIndex >= 0 Then

FoundItem = Me.Items(FoundIndex) 'Αντικείμενο μέσα στο Items Collection

FoundText = Me.GetItemText(FoundItem) 'Κείμενο του αντικειμένου

AppendText = FoundText.Substring(Typed.Length) 'Κείμενο μετά από το σημείο του μέχρι τώρα πληκτρολογηθέντος

Me.Text = Typed & AppendText 'Δημιουργία κειμένου

Me.SelectionStart = Typed.Length 'Θέση από όπου θα συνεχισθεί η πληκτρολόγηση

Me.SelectionLength = AppendText.Length 'Επιλογή όλων των χαρακτήρων μετά την θέση της τελευταίας πληκτρολόγησης

End If

End Sub

Private Sub myCombo_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Leave

Dim FoundIndex As Integer

FoundIndex = Me.FindStringExact(Me.Text) 'Ακριβής εύρεση στην θέση του Items Collection

Me.SelectedIndex = -1

Me.SelectedIndex = FoundIndex 'Επιλογή θέσης στο Items Collection

End Sub

End Class

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

Βέβαια υπάρχουν πολλά έτοιμα τέτοιου τύπου controls στην αγορά μέ απείρως περισσότερη λειτουργικότητα αλλά κοστίζουν.

Υ.Γ. Για VS2005 επειδή δέν το έχω δουλέψει δέν ξέρω αν την παραπάνω λειτουργικότητα την έχει από μονο του το Windows.Forms.ComboBox

IE AUTOMATATION

Δημοσιεύτηκε στις Τετάρτη, 29 Μαρτίου 2006 7:27 μμ από το μέλος imanos :: 0 σχόλια
Καταχώρηση στις κατηγορίες:

Πώς μπορούμε νά σηκώσουμε τον IE μέσα από την εφαρμογή

ο κώδικας είναι στό συνημμένο αρχείο στο παρακάτω link.

http://www.dotnetzone.gr/cs/forums/11335/ShowPost.aspx

Αλήθεια Σωτήρη - Μάνο γιατί δέν μπορώ να επισυνάψω σέ μια δημοσίευση κάποιο αρχείο?

 

Δωρεάν Βιβλίο για VB2005

Δημοσιεύτηκε στις Τετάρτη, 29 Μαρτίου 2006 3:46 μμ από το μέλος imanos :: 0 σχόλια
Καταχώρηση στις κατηγορίες:

Έπεσα σ'αυτό το link του MSDN. Μπορείτε να το κατεβάσετε δωρεάν

http://msdn.microsoft.com/vbasic/learning/introtovb2005/

Progress bar και διαχείριση των χρωμάτων

Δημοσιεύτηκε στις Τετάρτη, 29 Μαρτίου 2006 3:22 μμ από το μέλος imanos :: 1 σχόλια
Καταχώρηση στις κατηγορίες:

Στο παρακάτω κομμάτι μπορούμε να δούμε πώς μπορούμε να αλλάξουμε το backcolor και barcolor ενός progressbar.

Στην Form1 βάζουμε
Ένα ColorDialogProgressbar=ColorDialogProgressbar1 , button=buttonBackColor ,button=buttonForeColor ,ProgressBar=progressbar1

Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer

'Δήλωση σταθερών
Const _BARCOLOR = &H409
Const _BKCOLOR = &H2001

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 progressbar1.Value = 5
 progressbar1.Maximum = 10
 ColorDialogProgressbar1.FullOpen = True
End Sub

' Events των Buttons
Private Sub buttonBackColor_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buttonBackColor.Click
 If ColorDialogProgressbar1.ShowDialog() = DialogResult.OK Then
    PostMessage(progressbar1.Handle, _BKCOLOR, 0, ColorTranslator.ToOle(ColorDialogProgressbar1.Color))
 End If

End Sub
Private Sub buttonForeColor_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buttonForeColor.Click
 If ColorDialogProgressbar1.ShowDialog() = DialogResult.OK Then

    PostMessage(progressbar1.Handle, _BARCOLOR, 0, ColorTranslator.ToOle(ColorDialogProgressbar1.Color))
 End If
End Sub

 

Το παραπάνω αφορά progressBar για VS2002  σε VS2005 δεν έχω δεί το progressbar πως δουλεύει.

 

Παναγιώτη δέν ξέρω γιατί δέν μπορώ να βάλω σχόλιο για απάντηση στο σχόλιο που έκανες αλλά όπως αναφέρω παραπάνω το εργαλείο που έχω και χρησιμοποιώ είναι  το VS2002 και σ'αυτό στό progressbar δέν υπάρχουν οι δύνατότητες που αναφέρεις

Εντολές VB6 και ανίστοιχες σε VB.NET

Δημοσιεύτηκε στις Τρίτη, 28 Μαρτίου 2006 10:04 πμ από το μέλος imanos :: 0 σχόλια
Καταχώρηση στις κατηγορίες:

Παρακάτω βλέπουμε την αντιστοιχία και την χρήση
 VB 6 Εντολών  σέ VB.NT

    Len = .Length
    Mid = .SubString
    Replace = .Replace
    InStr = .IndexOf
    UCase = .ToUpper
    LCase = .ToLower
    Split = .Split

   
A) Παίρνοτας το μέγεθος ενός χαρακτήρα ή μιάς μεταβλητής

    Textbox1.Text.Length
    
O παραπάνω κώδικας μάς επιστρέφει το μέγεθος του χαρακτήρα πού βρίσκεται στο Textbox1

    Dim StrText As String
    Dim r As Integer
   
    StrText = "Θα πάμε εκδρομή στο Ναύπλιο?"
    r = StrText.Length
    MsgBox(r)
   
B) Παρακάτω βλέπουμε πώς εκτελείται η Mid function thw VB6 σέ .ΝΕΤ

    Dim r As String = "Γειά σου κόσμε"
    r = r.Substring(4)
   
    MsgBox(r)
   
    ή

    Dim r As String = "Γειά σου κόσμε"
    r = r.SubString(6, 3)
    MsgBox(r)
   
Γ) Εκτέλεση της Instr σέ .NET κώδικα

    Dim r As String = "Θα περάσουμε ένα υπέροχο Σαββατοκύριακο"
    r = r.IndexOf("υπέροχο")
   
    MsgBox(r)
   

Δ) Εκτέλεση της Replace σέ .ΝΕΤ

    Dim i As String = "Ήμουν βλάκας που σέ πίστεψα"
    i = i.Replace("βλάκας", "ηλίθιος")
   
    MsgBox(i)
   
   
Ε) Δουλεύοντας της UCASE και LCASE της VB6 σε .ΝΕΤ

    Dim r as String
    r = "Θα έρθω να σε πάρω στις 8 το βράδυ"
    r = r.ToUpper
     
    TextBox1.Text = r
   

    Dim r as String
    r = "ΘΑ ΕΡΘΩ ΝΑ ΣΕ ΠΑΡΩ ΣΤΙΣ 8 ΤΟ ΒΡΑΔΥ"
    r = r.ToLower
    TextBox1.Text = r
   

   
ΣΤ) Δημιουργία arrays μέ την Split

    Dim i As String = "κειμενο1;κειμενο2;κειμενο3;κειμενο4"
    Dim a() As String
    Dim j As Integer
    a = i.Split(";")
    For j = 0 To a.GetUpperBound(0)
    MsgBox(a(j))
    Next
   
   

Διαγραφή άδειων φακέλλων ενός Directory

Δημοσιεύτηκε στις Τρίτη, 28 Μαρτίου 2006 9:14 πμ από το μέλος imanos :: 0 σχόλια
Καταχώρηση στις κατηγορίες:

Πώς μπορούμε να διαγράψουμε άδειους φακέλους .

Imports System.IO

Public Sub DelEmptyFolders(ByVal DirPath As String)

Dim SubDirs() As String = Directory.GetDirectories(DirPath)

Dim strDir As String

For Each strDir In SubDirs

DelEmptyFolders(strDir)

Next

If Directory.GetFiles(DirPath).Length + Directory.GetDirectories(DirPath).Length = 0 Then

Directory.Delete(DirPath)

Console.WriteLine("Διαγραφή φακέλου: " & DirPath)

End If

End Sub

Οπότε μπορούμε να κάνουμε κλήση της DelEmptyFolders μεθόδου π.χ. DelEmptyFolders ("C:\")  για να διαγραφούν όλοι οι άδειοι φάκελλοι στό σύστημα

Πρόβλημα μέ Database

Δημοσιεύτηκε στις Κυριακή, 26 Μαρτίου 2006 1:15 μμ από το μέλος imanos :: 0 σχόλια
Καταχώρηση στις κατηγορίες:

Επειδή πρίν από κάποιο διάστημα είχα ένα πρόβλημα μέ μιά Database σε ένα pc που είχε κτυπήσει ο δίσκος και μπόρεσα και έσωσα το mdf από την βάση αλλά είχα πρόβλημα στο attach της database έθεσα το πρόβλημα στο dotnetzone καί ΄μπόρεσα να βρώ την λύση μέσα από αυτό.

Σας παραθέτω το link που είχε γίνει η σχετική συζήτηση τυχόν και βρεθεί και κάποιος άλλος σ'αυτή την θέση.

http://www.dotnetzone.gr/cs/forums/8927/ShowPost.aspx

 

Ευχαριστώ τον raPhaeL για την βοήθειά του

Πώς μπορούμε ένα adodb.recordset να το μεταφέρουμε σε ένα Dataset

Δημοσιεύτηκε στις Πέμπτη, 23 Μαρτίου 2006 3:40 μμ από το μέλος imanos :: 0 σχόλια
Καταχώρηση στις κατηγορίες:

Imports System.Data.OleDb

Imports ADODB

Public Class Form1

Inherits System.Windows.Forms.Form

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

AdoDBRecToDs("myServerName", "pubs")

End Sub

Private Function AdoDBRecToDs(ByVal Server As String, ByVal DbName As String)

Dim cnn As Connection = New ADODB.Connection()

Dim adors As Recordset = New ADODB.Recordset()

cnn.open("PROVIDER=SQLOLEDB;DATA SOURCE=" & Server & ";" & _

"INITIAL CATALOG=" & DbName & ";INTEGRATED SECURITY=SSPI;")

 'Δημιουργία recordset--

'Δήλωση οποιουδήποτε πίνακα στην βάση

Dim sql As String = "select * from authors"

adors.open(sql, cnn, CursorTypeEnum.adOpenForwardOnly, LockTypeEnum.adLockReadOnly, 0)

Dim da As New OleDbDataAdapter()

Dim ds As New DataSet()

'Μεταφορά του recordset στο Dataset

da.Fill(ds, adors, "authors")

'Γέμισμα ενός Grid

grd.DataSource = ds.Tables("authors")

'Τερματισμός σύνδεσης

cnn.Close()

End Function

End Class

Πώς μπορούμε να δούμε άν η Εφαρογή μας ήδη τρέχει σε κάποιο προηγούμενο process

Δημοσιεύτηκε στις Πέμπτη, 23 Μαρτίου 2006 3:13 μμ από το μέλος imanos :: 0 σχόλια
Καταχώρηση στις κατηγορίες:

Ο παρακάτω κώδικας μάς δείχνει άν η εφαρμογή μας ήδη τρέχει σε κάποιο προηγούμενο process

Imports System.Runtime.InteropServices

Public Const ERROR_ALREADY_EXISTS As Integer = 183

Public
Declare Function CreateMutexA Lib "Kernel32.dll" (ByVal lpSecurityAttributes As Integer, ByVal bInitialOwner As Boolean, ByVal lpName As String) As Integer

Public Declare Function GetLastError Lib "Kernel32.dll" () As Integer

Public Function ProcIsRunning() As Boolean

    'Προσπάθεια δημιουργίας ενός Default Mutex το οποίο ανήκει στο process
   
'Το  MyApplication μπορεί να αντικατασταθεί μέ το όνομα της εφαρμογής .
   
CreateMutexA(0, True, "MyApplication")
    Return (GetLastError() = ERROR_ALREADY_EXISTS)
End Function

Upgrade στο σχήμα της βάσης μας σέ νέο Version για SQL2000

Δημοσιεύτηκε στις Πέμπτη, 23 Φεβρουαρίου 2006 9:30 πμ από το μέλος imanos :: 0 σχόλια
Καταχώρηση στις κατηγορίες:

Στο συγκεκριμμένο θέμα θα δούμε πώς μπορούμε νά κάνουμε upgrade του σχήματος της βάσης μασ σέ νέο version ακόμα και όταν το version που είναι εγκατεστημμένο είναι πολύ παλαιότερο και δέν θελουμε να τρέξουμε όλα τά προηγούμενα patches που μπορεί νά υπάρχουν.

Ας υποθέσουμε ότι έχουμε ένα πινακα στην βάση μας όπως παρακάτω.

myTable
(
 columnA INT not null,
 columnB varchar(10) not null,
 columnC varchar(60) null
 columnD varchar(20) null
 columnE float default(0)
)

και θέλουμε τώρα νά τον κάνουμε upgrade στην νέα version

myTable
(
 columnA INT not null,
 columnB varchar(10) not null,
 columnC varchar(60) null
 columnD varchar(20) null
 columnE float default(0)
 columnF smallint default(0),
 columnG numeric(28,2) default(0)
)

σίγουρα θά μπορούσαμε νά τρέξουμε ένα Alter statement και αυτό νά πραγματοποιηθεί.Αλλά η column columnF έχει δημιουργηθεί σέ προηγούμενο version της εφαρμογής μας το οποίο και δέν έχει εγκατασταθεί.Πώς θα μπορούσαμε να κάνουμε την νέα εγκατάσταση χωρίς να χρειάζεται να τρέξουμε το προηγούμενο set εγκατάστασης?

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

create function dbo.DynSqlInsert 
  (
   @tblName varchar(255),
          @type smallint --0 Δημιουργία Insert Statment,1 Δυμιουργία Select Stament
  )
returns varchar(8000)
as
begin
 declare @objId int,@retString  varchar(8000),@name varchar(255)
 select @retString=''
 select @objId=id from sysobjects where name=@tblName

DECLARE cur1 cursor for
select name from syscolumns where
id=@objId
open cur1
fetch next from cur1 into @name
  while @@fetch_status=0
    begin
     set @retString=@retString+','+@name
fetch next from cur1 into @name
end
close cur1
deallocate cur1
if @type=0
begin
select @retString='insert into TMP_' + @tblName + '
('+substring(@retString,2,len(@retString))+')'
end
else
begin
select @retString='select '+substring(@retString,2,len(@retString))+' from
'+@tblName+' TABLOCKX'  ---΄΄Κλειδώνουμε τον πίνακα
end
return @retString
end

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

Create table TMP_myTable
(
 columnA INT not null,
 columnB varchar(10) not null,
 columnC varchar(60) null
 columnD varchar(20) null
 columnE float default(0)
 columnF smallint default(0),
 columnG numeric(28,2) default(0)
)

Κατόπιν δηλώνουμε δύο μεταβλητές @str1 varcahr(8000),@str2 varchar(8000) και τους περνάμε της τιμές που γυρίζουν κατά περίπτωση από την παραπάνω function

declare @str1 varchar(8000),@str2 varchar(8000)
  select @str1=dbo.DynSqlInsert('myTable',0),@str2=dbo.DynSqlInsert('myTable',1)

τά στοιχεία που γυρίζουν ένα τα παρακάτω

insert into TMP_myTable (columnA,columnB,columnC,columnD,columnE)
select columnA,columnB,columnC,columnD,columnE from myTable TABLOCKX

οπότε μπορούμε νά δημιουργήσουμε το insert Statment των Data στον νέο πίνακα εκτελώντας

exec (@str1+' '+@str2)

Κατόπιν κάνουμε drop τον παλιό πίνακα και rename τον καινούργιο

DROP TABLE myTable

EXECUTE sp_rename N'TMP_myTable', N'myTable', 'OBJECT'

Έτσι λοιπόν μπορούμε σέ ένα αρχείο νά έχουμε δημιουργήσει το τελευταίο σχήμα της βάσης μας και απο τον client να γίνει το upgrade.

Σημείωση :

Σε SQL2005 δέν έχει δοκιμαστεί.

 

Ένα trick για να μήν εμφανίζεται η Horizontal Scroll bar σέ TreeView όταν αυτό γεμμίζετε και είναι σε κατάσταση hidden

Δημοσιεύτηκε στις Πέμπτη, 16 Φεβρουαρίου 2006 11:38 πμ από το μέλος imanos :: 0 σχόλια
Καταχώρηση στις κατηγορίες:

Private Sub TreeView_VisibleChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TreeView1.VisibleChanged

'Με αυτό τον τρόπο αποφεύγουμε την εμφάνιση της horizontal scrollbar όταν το treeview γεμίζετε ενώ η κατάσταση του είναι hidden.

'Δηλώνουμε το  width σε 0, εφόσον το treeview είναι docked, τότε αυτό θά πάρει το μέγεθος που πρέπει αλλά το μέγεθος του scroll bars σ' αυτό θά επαναυπολογιστεί

CType(sender, TreeView).Width = 0

End Sub

Διαχωρισμός Delimited String στον SQL

Δημοσιεύτηκε στις Σάββατο, 11 Φεβρουαρίου 2006 10:47 πμ από το μέλος imanos :: 0 σχόλια
Καταχώρηση στις κατηγορίες:

Πολλές φορές μπορεί νά έχουμε ένα πεδίο varchar του οποίου τάσ στοιχεία είναι χωρισμένα μέ Delimited και θέλουμε νά τα διαχωρίσουμε.

Αυτό μπορεί νά γίνει βέβαια από τον client μέσω VB.NET η C#.Αλλά πώς μπορούμε νά το κάνουμε μέσα από τον SQL όταν το συγκεκριμμένο πεδίο θέλουμε νά το χρησιμοποιήσουμε μέσα σε μιά Stored Procedure στον MS SQL.

Παρακάτω σας παραθέτω μία function με την οποία μπορούμε να το πετύχουμε.

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FnBreakDelimited]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[FnBreakDelimited]
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO
create function dbo.FnBreakDelimited(@StringToBreak varchar(255),@Delimiter varchar(1))
returns int
as
BEGIN
declare @pos int
select @pos=charindex(@Delimiter,@StringToBreak)
return @pos
END
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

Χρησιμοποίηση της παραπάνω function

Ας υποθέσουμε πώς έχουμε μιά varchar μεταβλητή

Declare @vStr varchar(80)

Επίσης μία varchar μεταβλητή πού δημιουργεί άνα δυναμικό string που θα χρησιμοποιηθεί μέσα σέ ένα δυναμικό SQL



Declare @DynSQL varchar(255),@pos int
select @vStr='1,2,3,4,5,6',@DynSQL=' IN ('
while @vStr<>''
begin
set @pos=master.dbo.FnBreakDelimited(@vStr,',')
if @pos>0
 begin
  set @DynSQL=@DynSQL+substring(@vStr,1,@pos-1)+','
  set @vStr=substring(@vStr,@pos+1,len(@vStr))
 end
else
if @pos=0
 begin
  set @DynSQL=@DynSQL+@vStr
  set @vStr=''
 end
end

set @DynSQL=substring(@DynSQL,1,len(@DynSQL)-1)+')'

--Επιστροφή varchar για δημιουργία SQL 
select @DynSQL

--Αποτέλεσμα

IN (1,2,3,4,5,6)

Στην εκτέλεση της Function όπως βλέπετε χησιμοποίησα την master Database αυτό το έκανα γιατί εκεί την δημιούργησα για να μπορώ νά έχω πρόσβαση σ'αυτή απο οποιαδήποτε άλλη βάση και να μήν χρειάζεται νά την δημιουργώ σέ κάθε βάση που θά την χρειαστώ

Αυτά προς το παρόν

Περισσότερες Δημοσιεύσεις Επόμενη »