Ecco lo script per abilitare il broker su un database di SQL server
declare @DatabaseName nvarchar(1000)
set @DatabaseName = 'myDatabase'
if((select is_broker_enabled from sys.databases WHERE name = @DatabaseName) = 0)
begin
DECLARE SysProc CURSOR LOCAL FORWARD_ONLY DYNAMIC READ_ONLY FOR
SELECT spid
FROM master.dbo.sysprocesses
WHERE dbid =
(SELECT dbid FROM master.dbo.sysdatabases
WHERE name = @DatabaseName)
DECLARE @SysProcId smallint
OPEN SysProc --kill all the processes running against the database
FETCH NEXT FROM SysProc INTO @SysProcId
DECLARE @KillStatement char(30)
WHILE @@FETCH_STATUS = 0
BEGIN
SET @KillStatement = 'KILL ' + CAST(@SysProcId AS char(30))
EXEC (@KillStatement)
FETCH NEXT FROM SysProc INTO @SysProcId
END
WAITFOR DELAY '000:00:01'
ALTER DATABASE IBCMS_bookingManager SET ENABLE_BROKER
end
E questo è quello che serve per disabilitarlo:
declare @DatabaseName nvarchar(1000)
set @DatabaseName = 'myDatabase'
if((select is_broker_enabled from sys.databases WHERE name = @DatabaseName) = 1)
begin
print @DatabaseName + ' has broker enabled. Start disabling process....'
print 'Initial status of ' + @DatabaseName +': '+ convert(nvarchar(max), DATABASEPROPERTYEX(@DatabaseName, 'Status')) + ' ...'
/*
exec('Alter database '+ @DatabaseName +' set offline')
select DATABASEPROPERTYEX(@DatabaseName, 'Status')
exec('Alter database '+ @DatabaseName +' set online')
select DATABASEPROPERTYEX(@DatabaseName, 'Status')
*/
DECLARE SysProc CURSOR LOCAL FORWARD_ONLY DYNAMIC READ_ONLY FOR
SELECT spid
FROM master.dbo.sysprocesses
WHERE dbid =
(SELECT dbid FROM master.dbo.sysdatabases
WHERE name = @DatabaseName)
DECLARE @SysProcId smallint
OPEN SysProc --kill all the processes running against the database
FETCH NEXT FROM SysProc INTO @SysProcId
DECLARE @KillStatement char(30)
WHILE @@FETCH_STATUS = 0
BEGIN
SET @KillStatement = 'KILL ' + CAST(@SysProcId AS char(30))
EXEC (@KillStatement)
FETCH NEXT FROM SysProc INTO @SysProcId
END
WAITFOR DELAY '000:00:01'
ALTER DATABASE IBCMS_BookingManager SET DISABLE_BROKER
print 'Now ' + @DatabaseName + ' has broker disabled'
end
else
print @DatabaseName + ' has broker already disabled'
lunedì 28 aprile 2008
mercoledì 23 aprile 2008
mettere offline un database usando un sql script
Capita spesso che bisogna mettere offline un database (per fare manutenzione, ad esempio).
Magari bisognerebbe gestire questa operazione da codice.
Ecco che ci viene in aiuto T-SQL.
Le istruzioni fondamentali sono due
DATABASEPROPERTYEX(@DatabaseName, 'Status')
serve vedere in che stato è il database: tra i vari risultati c'è ONLINE e OFFLINE (autoesplicativi);
Alter database MioData set offline
e questo serve per modificargli lo stato.
Per altre info rimando al'MSDN
Magari bisognerebbe gestire questa operazione da codice.
Ecco che ci viene in aiuto T-SQL.
Le istruzioni fondamentali sono due
DATABASEPROPERTYEX(@DatabaseName, 'Status')
serve vedere in che stato è il database: tra i vari risultati c'è ONLINE e OFFLINE (autoesplicativi);
Alter database MioData set offline
e questo serve per modificargli lo stato.
Per altre info rimando al'MSDN
mercoledì 9 aprile 2008
Abstract Control
Il designer di Visual Studio.NET (sto lavorando con 2005) ha delle difficoltà a lavorare sulla grafica quando un control deriva da una classe abstract (che deriva a sua volta da UserControl).
In questi casi rinuncio ad avere la classe abstract e trasformo tutti le proprietà e i metodi abstract in qualcosa di default (i metodi che lo consentono vengono creati vuoti).
In questi casi rinuncio ad avere la classe abstract e trasformo tutti le proprietà e i metodi abstract in qualcosa di default (i metodi che lo consentono vengono creati vuoti).
giovedì 13 marzo 2008
CASE - WHEN in SQL
Ho scoperto questo operatore che non avevo ancora incontrato:
select name,
CASE type
WHEN 1 THEN 'private customer'
WHEN 2 THEN 'public customer'
WHEN 3 THEN 'reseller'
ELSE 'unknown'
END
from Agenda
select name,
CASE type
WHEN 1 THEN 'private customer'
WHEN 2 THEN 'public customer'
WHEN 3 THEN 'reseller'
ELSE 'unknown'
END
from Agenda
WITH in SQL
Spesso in una query di SQL si ha bisogno di un risultato da utilizzare per varie operazioni.
Anzichè ricalcolare sempre tutto il risultato ogni volta si può utilizzare questa forma:
WITH tempTable(id,name)
as
(
select idUtente, NomeUtente from Utenti
where Affilizazione < @data
)
select * from tempTable.
....
....
Questa funzione è molto potente perchè riduce i tempi di elaborazione dello script.
Da ricordare che WITH deve essere preceduto da GO o dal punto e virgola (';') se prima di WITH c'è un'altra query.
Anzichè ricalcolare sempre tutto il risultato ogni volta si può utilizzare questa forma:
WITH tempTable(id,name)
as
(
select idUtente, NomeUtente from Utenti
where Affilizazione < @data
)
select * from tempTable.
....
....
Questa funzione è molto potente perchè riduce i tempi di elaborazione dello script.
Da ricordare che WITH deve essere preceduto da GO o dal punto e virgola (';') se prima di WITH c'è un'altra query.
venerdì 30 novembre 2007
Come creare un web control contenitore
Nel nostro controllo modifichiamo la fase di render a run-time inserendo un Javascript che emette l'HTML.
protected override void Render(HtmlTextWriter output){
output.Write("");
}
creiamo la classe per il rendering a design-time.
public class DesignTime : ControlDesigner{
ControlloCon FControllo;
public override void Initialize(System.ComponentModel.IComponent component){
this.FControllo = (ControlloCon)component;
base.Initialize(component);
}
public override string GetDesignTimeHtml() {
try{
if (FControllo.Text == string.Empty)
return GetEmptyDesignTimeHtml();
else
return "
";
}
catch(Exception ex){
return GetErrorDesignTimeHtml(ex);
}
}
protected override string GetEmptyDesignTimeHtml(){
return "
";
}
protected override string GetErrorDesignTimeHtml(Exception e){
return CreatePlaceHolderDesignTimeHtml(e.Message);
}
}
Infine associamo il controllo alla classe di DesignTime.
[Designer("ControlloConDesignTime.DesignTime")]
public class ControlloCon: System.Web.UI.WebControls.WebControl{
protected override void Render(HtmlTextWriter output){
output.Write("");
}
creiamo la classe per il rendering a design-time.
public class DesignTime : ControlDesigner{
ControlloCon FControllo;
public override void Initialize(System.ComponentModel.IComponent component){
this.FControllo = (ControlloCon)component;
base.Initialize(component);
}
public override string GetDesignTimeHtml() {
try{
if (FControllo.Text == string.Empty)
return GetEmptyDesignTimeHtml();
else
return "
| " + FControllo.Text + " |
}
catch(Exception ex){
return GetErrorDesignTimeHtml(ex);
}
}
protected override string GetEmptyDesignTimeHtml(){
return "
| " + typeof(ControlloCon) + " " + FControllo.ID + " |
}
protected override string GetErrorDesignTimeHtml(Exception e){
return CreatePlaceHolderDesignTimeHtml(e.Message);
}
}
Infine associamo il controllo alla classe di DesignTime.
[Designer("ControlloConDesignTime.DesignTime")]
public class ControlloCon: System.Web.UI.WebControls.WebControl{
martedì 27 novembre 2007
Insert nel dataset di VS2005
Usando i typed dataset di VS2005 come data layer si risparmia un sacco di tempo perchè si auto crea tutto uno strato di classi, metodi e query (per SQL: è questo l'ambiente che uso) che possono essere usati dallo strato business sovrastante.
Oggi ho scoperto una cosa alquanto allarmante, almeno fintanto che non lo si sa.
Mi focalizzo sul metodo di insert di una tabella del dataset. Si può sceglere tra text o stored procedure o table direct.
Nel caso si scelga text si può inserire il testo in due modi:
- usando il query builder (cliccando sugli appositi 3 puntini nel campo CommandText delle proprietà);
- inserendo a mano la query (magari facendo un copia/incolla da SQL manager).
C'è però una notevole differenza tra i due metodi: il primo infatti accoda "di soppiatto" un comando di select conforme con il comando di insert appena editato da noi.
Questo select è FONDAMENTALE in quanto serve per riportare i nuovi valori dal database al dataset che, in caso di assenza del select, rimane con i valori vecchi.
Il caso più eclatante si ha quando l'insert interessa delle righe di una tabella che ha un'indice auto-increment: auto-increment sia sul db (con step positivi) sia sul db (con step negativi)*.
In questo caso gli indici delle righe appena INSERITE sul db manterranno l'indice negativo ma cambieranno stato da added a unchanged. Ad un successivo cambio di stato in Modified si genererà una eccezione di mancanza di chiave primaria in fase di UPDATE, in quanto l'adapter farà affidamento sull'indice di riga rimasto negativo e disallineato dal db.
*: sul perchè è utile fare step negativi nel db per indici auto-increment rimando alla documentazione MS.
Oggi ho scoperto una cosa alquanto allarmante, almeno fintanto che non lo si sa.
Mi focalizzo sul metodo di insert di una tabella del dataset. Si può sceglere tra text o stored procedure o table direct.
Nel caso si scelga text si può inserire il testo in due modi:
- usando il query builder (cliccando sugli appositi 3 puntini nel campo CommandText delle proprietà);
- inserendo a mano la query (magari facendo un copia/incolla da SQL manager).
C'è però una notevole differenza tra i due metodi: il primo infatti accoda "di soppiatto" un comando di select conforme con il comando di insert appena editato da noi.
Questo select è FONDAMENTALE in quanto serve per riportare i nuovi valori dal database al dataset che, in caso di assenza del select, rimane con i valori vecchi.
Il caso più eclatante si ha quando l'insert interessa delle righe di una tabella che ha un'indice auto-increment: auto-increment sia sul db (con step positivi) sia sul db (con step negativi)*.
In questo caso gli indici delle righe appena INSERITE sul db manterranno l'indice negativo ma cambieranno stato da added a unchanged. Ad un successivo cambio di stato in Modified si genererà una eccezione di mancanza di chiave primaria in fase di UPDATE, in quanto l'adapter farà affidamento sull'indice di riga rimasto negativo e disallineato dal db.
*: sul perchè è utile fare step negativi nel db per indici auto-increment rimando alla documentazione MS.
Iscriviti a:
Post (Atom)