mercoledì 29 febbraio 2012

Ricavare Giorno della settimana da una data

SELECT    CASE
            WHEN DATENAME(dw, GETDATE()) = 'Sunday'
                THEN 'Domenica'
            WHEN DATENAME(dw, GETDATE()) = 'Monday'
                THEN 'Lunedi'
            WHEN DATENAME(dw, GETDATE()) = 'Tuesday'
                THEN 'Martedi'
            WHEN DATENAME(dw, GETDATE()) = 'Wednesday'
                THEN 'Mercoledi'
            WHEN DATENAME(dw, GETDATE()) = 'Thursday'
                THEN 'Giovedi'
            WHEN DATENAME(dw, GETDATE()) = 'Friday'
                THEN 'Venerdi'
            WHEN DATENAME(dw, GETDATE()) = 'Saturday'
                THEN 'Sabato'
            ELSE 'Errore'
        END AS Giorno

lunedì 27 febbraio 2012

CTE che contiene una colonna contatore generata

declare @limit int
set @limit = 100

;with MyCte AS
    (select   MyCounter = 1
     UNION ALL
     SELECT   MyCounter + 1
     FROM     MyCte
     where    MyCounter < @limit )
    
select MyCounter
from   MyCte
option (maxrecursion 0)

venerdì 24 febbraio 2012

aggiungere server collegato Access ACCDB

declare @nomeServer nvarchar(MAX)
declare @serverPath nvarchar(MAX)  /* il file deve essere SULLA STESSA MACCHINA*/
set @nomeServer = 'server name'
set @serverPath = 'file mdb full path'

EXEC sp_addlinkedserver
    @server = @nomeServer,
    @provider = N'Microsoft.Jet.OLEDB.4.0',
    @srvproduct = N'Access',
    @datasrc = @serverPath

-- setto logina al nuovo Server DB
EXEC sp_addlinkedsrvlogin
    @rmtsrvname = @nomeServer,
    @useself = N'FALSE'
    /* dati non necessari per DB senza USR e PSW */
    --,@locallogin = NULL
    --,@rmtuser = NULL 
    --,@rmtpassword = NULL

-- TEST: lista tabelle per nuovo server
EXEC sp_tables_ex @nomeServer
GO

venerdì 16 dicembre 2011

Calcolare pesantezza Tabelle sql




 SELECT SYS_OBJ.NAME AS "TABLE NAME"

     , SYS_INDX.ROWCNT AS "ROW COUNT"

FROM SYSOBJECTS SYS_OBJ, SYSINDEXES SYS_INDX



WHERE SYS_INDX.ID = SYS_OBJ.ID

  AND INDID IN(0,1)

  AND XTYPE = 'U'

 AND SYS_OBJ.NAME <> 'SYSDIAGRAMS'



ORDER BY SYS_INDX.rowcnt DESC

COMPUTE SUM(SYS_INDX.ROWCNT)

lunedì 31 ottobre 2011

Resettare cache in pagina Web

Per resettare la Cache e obbligare il ricaricamento di tutti i contenuti aggiungere questi meta alla pagina:





    <meta http-equiv="CACHE-CONTROL" content="NO-CACHE" />

    <meta http-equiv="EXPIRES" content="0" />

    <meta http-equiv="PRAGMA" content="NO-CACHE" />

martedì 13 settembre 2011

settare un campo di tipo datetime in SQL


update NomeTabella

set NomeColonna = convert(datetime,'31/12/2099')
WHERE nnc_cartcanas = 'ADB'

Lanciare una pagina in target _blank da code behind

Per aprire un link in una nuova scheda utilizzare il codice:

Response.Write("")

Aggiungere un controllo dinamicamente alla pagina

Per aggiungere un controllo dinamicamente ad una pagina aspx è necessario utilizzare il seguente frammento di codice:
Dim ctrlInstances As SearchAreasInstancesUsc = LoadControl("SearchAreaInstancesUsc.ascx")


é fondamentale settare un Identificatore unico al controllo, in modo da non creare sovrapposizione delle informazioni tra i controlli attualmente presenti nella pagina.
ctrlInstances.ID = 1

giovedì 4 agosto 2011

Inserire Codice nel blog

Spesso mi capitava di dover inserire codice html sui post di blogger, ma visto che la piattaforma del blog "capisce" l'html, lo interpretava senza pubblicare il codice cosi com'era...

Per fare in modo che venga pubblicato il "codice puro" si deve fare affidamento a dei programmini che "proteggono" il codice da inserire, ve ne segnalo uno di esempio, ma in rete se ne trovano parecchi:

http://www.simplebits.com/

Ricerca di Google dal sito web

Per inserire una ricerca di google direttamente dal sito web è sufficiente inserire questo frammento di codice nella pagina web:


<center>

<FORM method=GET action="http://www.google.com/search">

<TABLE bgcolor="#FFFFFF"><tr><td>

<A HREF="http://www.google.com" target="_blank">

<IMG SRC="http://www.google.com/logos/Logo_40wht.gif" border="0"

ALT="Google" align="absmiddle"></A>

<INPUT TYPE=text name=q size=31 maxlength=255 value="">

<INPUT TYPE=hidden name=hl value=it>

<INPUT type=submit name=btnG VALUE="Cerca con Google">

</td></tr></TABLE>

</FORM>

</center>



martedì 2 agosto 2011

Versione progetto ClickOnce

Per ottenere il numero di versione per le applicazioni distribuite tramite il clickonce è sufficiente importare la referenza al progetto all'oggetto System.Deployment
e tramite il seguente codice:

if
(System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed)
{
this.Text = String.Format("MRS Map Printing Manager {0}",
Application.ApplicationDeployment.CurrentDeployment.CurrentVersion);
}

giovedì 7 luglio 2011

Ricavare il primo elemento di un gruppo di elementi


;WITH cte AS

(
SELECT n = row_number() over (partition by IdContatto order by IdLoginHistory desc)
, *
FROM TbLoginHistory
)
SELECT *
FROM cte
INNER JOIN TbContatti ON cte.IdContatto = TbContatti.IdContatto
WHERE n = 1
ORDER BY TbContatti.Cognome

martedì 28 giugno 2011

Ultimo giorno del mese in VBScript

Function UltimoGiorno(Data_Gio as Date) as Date
if Date_Gio = "" then
Data_Gio = Date
end if
UltimoGiorno = DateSerial( Year(Data_Gio), Month(Data_Gio)+1, 0 )
End Function

lunedì 13 giugno 2011

Ottenere ultimo giorno del mese

Per ottenere la data dell'ultimo giorno del mese

select
DATEADD(month, ((YEAR(GETDATE()) - 1900) * 12) + MONTH(GETDATE()), -1) as fine_mese

venerdì 20 maggio 2011

Eseguire chiamata Post a una pagina esterna

Per eseguire una chiamata ad un link passando dei parametri in post.


Response.Clear()

Dim sb As New StringBuilder()
sb.Append("")
sb.AppendFormat("")
sb.AppendFormat("
", link)
sb.AppendFormat("", UserName)
sb.AppendFormat("", Password)
' Other params go here
sb.Append("")

sb.Append("")
sb.Append("")

Response.Write(sb.ToString())

Response.End()

venerdì 6 maggio 2011

Abilitare scrittura campo Identity

Per abilitare la scrittura di un campo idendity di Sql Server inserire prima del codice Insert lo script:

SET IDENTITY_INSERT [dbo].[Tabella] ON

e dopo l'inserimento dei campi riabilitare il normale funzionamento con

SET IDENTITY_INSERT [dbo].[Tabella] OFF

martedì 5 aprile 2011

Passare parametri in post dinamicamente

Grazie a questo frammento di codice è possibile aprire un link passando dei parametri popolati dinamicamente.

Public Sub ApriLink(ByVal linkURL As String)
Dim UserName As String = "Username"
Dim Password As String = "Password"

Response.Clear()

Dim sb As New StringBuilder()
sb.Append("")
sb.AppendFormat("")
sb.AppendFormat("
", linkURL)
sb.AppendFormat("", UserName)
sb.AppendFormat("", Password)
' Other params go here
sb.Append("")

sb.Append("")
sb.Append("")

Response.Write(sb.ToString())

Response.End()
End Sub

mercoledì 23 marzo 2011

Unable to load DLL ‘sqlceme35.dll’

Se state sviluppando un’applicazione che utilizza SQL Server Compact Edition su una macchina x64, impostare nelle opzioni avanzate di compilazione la CPU di destinazione come “x86” e non “AnyCPU” per non incorrere nell’errore sopracitato (un P/Invoke non riuscito da parte di System.Data.SqlServerCe verso sqlceme35.dll). E’ da tenere conto che si applica sia alla versione 3.0, alla 3.5 ed alla 4. Questo perchè SQL Server Compact Edition su macchina x64 gira in WoW (Windows on Windows, emulazione x86 su x64).

venerdì 25 febbraio 2011

Chiamata a una funzione remota e incapsulare la risposta in una tabella temporanea

Con questa procedura è possibile richiamare una funzione su un server remoto, fare attenzione che prima devono essere abilitate le chiamate remote come descritto nel precedente post.
Creare la tabella Temporanea

CREATE TABLE #tmp (
cod char(10) ,
username varchar(80),
Codice_web varchar(10)
)


Dichiarare i parametri:

declare @la float
declare @lo float
declare @categoria nvarchar(MAX)


Dichiarare una stringa dove è possibile inserire i parametri:

DECLARE @sqlQuery VARCHAR(8000)
SET @sqlQuery = 'SELECT cod
, username
,Codice_web
FROM [DBRemoto].[dbo].[GeoSearch](
' + str(@lo) + '
, ' + str(@la) + '
, ''''' + @categoria + '''''
)'


E la stringa dove effettuare la chiamata remota e inserisci i risultati nella tabella temporanea:


DECLARE @finalQuery VARCHAR(8000)
SET @finalQuery = 'INSERT into #tmp SELECT cod
, username
,Codice_web
FROM OPENQUERY([ServerCollegato],' + '''' + @sqlQuery + '''' + ')'


Alla fine si esegue la chiamata con

EXEC (@finalQuery)

select * from #tmp

drop table #tmp

lunedì 3 gennaio 2011

Errore in visualizzazione pagine di Visual Studio 2008

A seguito di una installazione (o modifiche Software) al Visual Studio possiamo incappare in un errore di questo genere quando tentiamo di aprire una pagina aspx:

package 'Visual Web Developer HTML SourceEditor Package' has failed to load properly (GUID={xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}}'

Per risolvere è sufficiente seguire la seguente procedura:

Aprire VS2008, click su Tools/Options

Check "Show all settings" option

Selezionare Environment/International Settings

Cambiare la lingua del combo box

Chiudere VS2008.

Lanciare da riga di comando devenv /resetskippkgs

martedì 12 ottobre 2010

Lanciare Stored Procedure su server remoto

Per lanciare una stored procedure su un server remoto è necessario aggiungere il server come server collegato (vedi procedura descritta in post precedente) e inoltre aggiungere l'opzione rpc = true e rpc out = true in questo modo:

EXEC master.dbo.sp_serveroption @server=N'Knauf_SIMI', @optname=N'rpc', @optvalue=N'true'
GO

EXEC master.dbo.sp_serveroption @server=N'Knauf_SIMI', @optname=N'rpc out', @optvalue=N'true'
GO


successivamente è sufficiente eseguire la procedura con la chiamata

EXEC [LinkedServer].Database.[dbOwner].[StoredProcedure] @param.

mercoledì 11 agosto 2010

Frammento di codice per il collegamento al db Sql Server

Dim connection As String = "Data Source=.\Istanza;Initial Catalog=Databas;User Id=Username;Password=Password;pooling=false;"
Dim cn As New SqlConnection(connection)
cn.Open()

Dim cm As New SqlCommand
cm.Connection = cn
Dim strSQL As String = "select * from TbContatti"
cm.CommandText = strSQL

Dim dt As New DataTable
Dim da As New SqlDataAdapter(cm)
da.Fill(dt)

lunedì 7 giugno 2010

Trovare Righe duplicate

Per trovare righe duplicate in una tabella Sql Server utilizzare il seguente script:

SELECT IdPigmento
, UserName
FROM TbPrezziPigmenti
GROUP BY IdPigmento
,UserName
HAVING COUNT(*) > 1

martedì 1 giugno 2010

Creare Datetime da Anno e Mese

Grazie a questo script è possibile creare un parametro Datetime avendo in ingresso anno e mese passati come interi.

declare @dt datetime

declare @anno int
set @anno = 2010

declare @MM int
set @MM = 6

declare @UTC nvarchar(8)
set @UTC = ltrim(rtrim(ltrim(rtrim(str(@anno)))))

DECLARE @GG nvarchar(2)
SET @GG = '01'

IF @MM < 10
SET @UTC = @UTC + '0' + ltrim(str(@MM))
ELSE
SET @UTC = @UTC + ltrim(rtrim(str(@MM)))

SET @UTC = @UTC + @GG

set @dt = cast(@UTC as datetime)
select @dt


Meglio con questa formattazione:

CAST(CAST(@y AS varchar) + '-' + CAST(@m AS varchar) + '-' + CAST('01' AS varchar) AS DATETIME)

lunedì 17 maggio 2010

Creazione Shortcut in progetti setup

Quando vogliamo inserire un collegamento (ad esempio nella cartella Send To) dobbiamo gestire la gestione dei collegamenti, perchè per default viene creata con "Advtertised Shortcut" mentre Send To funziona solo con "Regular Shortcut".
Per fare questo una volta creato il file di setup è necessario modificarlo con Orca, e nel menù Properties inserire la chiave "DISABLEADVTSHORTCUTS=1"

giovedì 6 maggio 2010

Ridurre il file di Log di SQL

Per ridurre il file di log di SQL Server i .ldf, è possibile procedere attraverso il management studio cliccando con il tasto destro sul database interessato, poi Tasks, Shrink ed infine Database.
In questo modo viene visualizzata la finestra dov'è possibile ridurre il file .ldf

giovedì 8 aprile 2010

Uccidere i processi attivi su un database

Grazie a questo script è possibile bloccare tutti i processi attivi su un database

DECLARE @DatabaseName nvarchar(50)
SET @DatabaseName = N'NomeDatabase'

DECLARE @STR_SQL nvarchar(max)
SET @STR_SQL = ''

SELECT @STR_SQL = @STR_SQL + 'Kill ' + Convert(varchar, SPId) + ';' FROM MASTER..SysProcesses WHERE DBId = DB_ID(@DatabaseName) AND SPId <> @@SPId

EXEC(@STR_SQL)

martedì 30 marzo 2010

Shortcut utili

Nel pacchetto di programmi Visual studio e SQL server è utile conoscere delle scorciatoie per velocizzare le operazioni.
Oggi grazie al buon Toby ho imparato questi:

CTRL + K + D Per Formattare tutto il file
CTRL + K + F Per formattare solo la parte selezionata

CTRL + K + C Per commentare
CTRL + K + D Per decommentare

lunedì 15 marzo 2010

Abilitare l'Update in oggetti SQL

Per permettere l'Update in oggetti già creati Sql Server è sufficiente impostare le opzioni come da immagine


lunedì 22 febbraio 2010

Cast di un DateTime alla mezzanotte

Per castare un datetime alla mezzanotte, in modo da poter fare confronti tra date è sufficiente la seguente funzione:

CAST(FLOOR(CAST(Data AS FLOAT))AS DATETIME)

lunedì 25 gennaio 2010

Eseguire trasformazioni XSLT utilizzando un MemoryStream

Procedura per utilizzare le trasformazioni XSLT senza dover ogni volta salvare il file ottenuto e quello in input per la trasformazione... Per fare ciò è possibile utilizzare le memory stream come descritto:

Dim ds As New DataSet
ds.Tables.Add(dt)
Dim reader As New XmlTextReader(ds.GetXml(), XmlNodeType.Document, Nothing)

' Leggo il file XSLT
Dim xslfile As String = IO.Path.Combine(Request.PhysicalApplicationPath, "xslt\Trasformazione.xslt")
Dim x As New Xsl.XsltSettings
x.EnableScript = True
x.EnableDocumentFunction = True
Dim tra As New Xsl.XslCompiledTransform
tra.Load(xslfile, x, Nothing)

' Trasformo la DataTable XMLizzata in HTML
Dim ms As New MemoryStream
Dim myWriter As New XmlTextWriter(ms, Nothing)
Dim myXPathDoc As New XPath.XPathDocument(reader)
tra.Transform(myXPathDoc, Nothing, myWriter)

Utility.ConvertToString(ms)


alla fine è possibile utilizzare una funzione che converte la memorystream in una stringa.

venerdì 22 gennaio 2010

Creare Server collegato con Sql Server 2008

Per collegare un server con Sql Server 2008 è sufficiente utilizzare la seguente procedura:

EXEC master.dbo.sp_addlinkedserver
@server = N'ServerName',
@srvproduct='',
@provider=N'SQLNCLI',
@datasrc=N'IndirizzoIp\Istanza', -- se Istanza definita, altrimenti basta l'IndirizzoIp
@catalog=N'DatabaseName'


Per modificare l'username di default per collegarsi a tale server la procedura da lanciare è questa:

EXEC master.dbo.sp_addlinkedsrvlogin
@rmtsrvname = N'ServerName',
@useself = 'FALSE',
@locallogin = NULL,
@rmtuser = 'Username',
@rmtpassword = 'Password'

venerdì 8 gennaio 2010

Attività di pulitura di un DataBase

Ecco un comodo script per pulire un database:

USE [NomeDatabase]
--
-- Attività Controlla integrità database
--
DBCC CHECKDB WITH NO_INFOMSGS
GO


--
-- Attività Elimina contenuto cronologia
--
declare @dt datetime select @dt = CAST(FLOOR(CAST(getdate() AS FLOAT))AS DATETIME)
exec msdb.dbo.sp_delete_backuphistory @dt
GO
declare @dt datetime select @dt = CAST(FLOOR(CAST(getdate() AS FLOAT))AS DATETIME)
EXEC msdb.dbo.sp_purge_jobhistory @oldest_date=@dt
GO
declare @dt datetime select @dt = CAST(FLOOR(CAST(getdate() AS FLOAT))AS DATETIME)
EXECUTE msdb..sp_maintplan_delete_log null,null,@dt

--
-- Attività Ricostruisci indice
--
USE NomeDatabase

DECLARE @tabella varchar(255)

DECLARE cursore_tabella CURSOR FOR
SELECT table_name FROM information_schema.tables
WHERE table_type = 'base table'

OPEN cursore_tabella

FETCH NEXT FROM cursore_tabella INTO @tabella
WHILE @@FETCH_STATUS = 0
BEGIN
DBCC DBREINDEX(@tabella,' ',90)
FETCH NEXT FROM cursore_tabella INTO @tabella
END

CLOSE cursore_tabella

DEALLOCATE cursore_tabella



--
-- Attività Compatta database
--
DBCC SHRINKDATABASE(N'NomeDatabase', 10, TRUNCATEONLY)
GO

mercoledì 30 dicembre 2009

Numerare le righe in SQL

Per numerare le righe in una select di SQL è sufficiente utilizzare il seguente codice:

SELECT ROW_NUMBER() OVER(ORDER BY IdTabella) AS Numero
FROM Tabella

martedì 15 dicembre 2009

Visualizzare il log di Sql Server

Per visualizzare le operazioni eseguite da Sql Server è possibile utilizzare l'oggetto Profiler (non presente nelle versioni express)
Per aprirlo dal management di sql server aprire Strumenti > Sql Profiler
Creare una traccia (prima icona a sx)
Togliere dalla seconda tab le opzioni non necessarie, eseguire e vedremo in diretta tutte le operazioni eseguite dal Sql Server.

A fine procedura stoppare la traccia e chiudere.

lunedì 9 novembre 2009

Gestione Condizione in trasformazioni XSLT

Nelle trasformazioni XSLT è possibile utilizzare il costrutto CHOOSE, una specie di Select Case del vb.
Nella condizione è possibile utilizzare più di un parametro utilizzando le parole chiave "and" e "or" rigorosamente in MINUSCOLO!!!

es.

xsl:choose>
xsl:when test="IdCategoriaAnnuncio = 15 or IdCategoriaAnnuncio = 21">
!-- Quello che si vuole inserire -->
/xsl:when>
/xsl:choose>

lunedì 2 novembre 2009

Modificare i prerequisiti in Visual Studio per i Setup

per modificare le procedure di setup è possibile modificare direttamente i Prerequisiti che Visual Studio installa in fase di setup.
Per la modifica di un'installazione Sql Express, ad esempio, troviamo nella cartella

C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\SqlExpress\it

per Visual Studio 2005,
mentre per Visual Studio 2008 lo troviamo in:

C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\SqlExpress\en

il file package.xml, andando a modificare i parametri per il comando di esecuzione è possibile modificare ad esempio il nome dell'istanza e la password per l'utente sa

command packagefile="sqlexpr32.exe" arguments="-q /norebootchk /qn reboot=ReallySuppress addlocal=all instancename=NOMEISTANZA SAPWD=PASSWORDSA SQLAUTOSTART=1" estimatedinstalledbytes="225000000" estimatedtempbytes="225000000" estimatedinstallseconds="420"

CORREZIONE!
Ho notato che se modifichiamo il nome dell'istanza al tentativo di installazione non si rende conto che una versione di SqlServer è già installata.. è comunque possibile mantenere la password inserita
Quindi questa è la versione corretta:

command packagefile="sqlexpr32.exe" arguments="-q /norebootchk /qn reboot=ReallySuppress addlocal=all instancename=SQLEXPRESS SAPWD=PASSWORDSA SQLAUTOSTART=1" estimatedinstalledbytes="225000000" estimatedtempbytes="225000000" estimatedinstallseconds="420"

modificare impostazioni MSDTC con Vista

per modificare le impostazioni MSDTC in vista eseguire la seguente istruzione:
dcomcnfg

dopo impostare l'msdtc sotto Servizi Componenti > Computer > Computer Locale > Distributed Transaction Coordinator >
tasto destro su DTC locale e da proprietà troviamo le impostazioni dell'MSDTC.

giovedì 8 ottobre 2009

Full-Text Search su SQL Server 2008

--Abilitare il funzionamento del fulltext search sui pdf
--installare il pdf IFilter di Foxit (o similari)
--installare l' IFilter per Office 2007 in modo da abilitare la ricerca sui documenti di office 2007
--Eseguire le 2 store procedure che abilitano i cambiamenti appena effettuati

exec sp_fulltext_service 'load_os_resources', 1
exec sp_fulltext_service 'verify_signature', 0;


--Riavviare il servizio SQL

exec sp_fulltext_service 'update_languages'
exec sp_fulltext_service 'restart_all_fdhosts';


--Verificare l'abilitazione dell'estensione funzionante
select document_type, path from sys.fulltext_document_types where document_type = '.docx'
select document_type, path from sys.fulltext_document_types where document_type = '.pdf'


--Creare un indice per la tabella interessata
--Generazione del catalogo
--CatalogoFiles = nome catalogo
--TbFiles = nome tabella
--PK_tbFiles_1 = nome Indice della tabella
--FileType = campo della tabella che contiene l'estensione del file

exec sp_fulltext_database @action='Enable'
exec sp_fulltext_catalog 'CatalogoFiles', 'create'
exec sp_fulltext_table 'TbFiles', 'create', 'CatalogoFiles', 'PK_tbFiles_1'
exec sp_fulltext_column 'TbFiles', 'systemFile', 'add', @type_colname='FileType'
exec sp_fulltext_table 'tbFiles', 'activate'
exec sp_fulltext_catalog @ftcat='CatalogoFiles', @action='start_full'
exec sp_fulltext_table 'TbFiles', 'Start_change_tracking'
exec sp_fulltext_table 'TbFiles', 'Start_background_updateindex'


--Sintassi per l'eliminazione del catalogo
exec sp_fulltext_table 'TbFiles', 'drop'
exec sp_fulltext_catalog @ftcat='CatalogoFiles', @action='drop'


--Ricerca del testo desiderato
-- FREETEXT Predicato utilizzato per eseguire una ricerca su colonne che contengono tipi
-- di dati carattere per valori corrispondenti al significato e non all'esatta formulazione
-- del testo nelle condizioni di ricerca. Se si utilizza FREETEXT,

select * from tbFiles where FREETEXT (systemFile, 'via Garibaldi')

--Predicato utilizzato in una clausola WHERE per eseguire ricerche in colonne contenenti
-- dati di tipo carattere per corrispondenze esatte
-- e se vogliamo combinare più parole per la ricerca abbiamo bisogno di aggiungere "and" o "or" nella ricerca.

select * from tbFiles where CONTAINS (systemFile, 'via OR Garibaldi')

giovedì 24 settembre 2009

Modificare valore campo AutoIncrement in MySQL

ALTER TABLE TableName AUTO_INCREMENT = Valore

martedì 22 settembre 2009

Scaricare immagini dal web lato codice

Per scaricare un'immagine dal web in locale è sufficiente il seguente frammento di codice:

Dim client As New System.Net.WebClient
client.DownloadFile("http://www.sitoweb.com/foto/appartamento.jpg", "C:\immagine.jpg")

martedì 8 settembre 2009

Aggiungere modulo di una stampante in Windows 7

Per aggiungere (o modificare) i moduli delle stampanti in windows 7, selezionare la stampante desiderata, cliccare su Proprietà server di stampa, e modificare i moduli a piacimento

venerdì 4 settembre 2009

Convertire un DataGridViewRow in DataRow

Ecco come convertire la riga selezionata di una griglia in una DataRow.

CType(grid.SelectedRows(0).DataBoundItem, DataRowView).Row

martedì 11 agosto 2009

Contare il numero di indici di una tabella MySql

per contare il numero di indici di una tabella in MySql utilizzare il seguente script:

SELECT COUNT(*) FROM information_schema.statistics
where table_schema = 'DBname' and table_name = 'TabName' and index_name = 'IndexName'

mercoledì 5 agosto 2009

Impostare la lingua per lo Script Manager

Come ottimamente suggerito da Carlo, è possibile impostare la lingua dei controlli ajax semplicemente impostando la localization dello script manager:

asp:ScriptManager ID="ScriptManager1" runat="server" EnableScriptLocalization="true" EnableScriptGlobalization="true" />

lunedì 3 agosto 2009

Visualizzare Date e Decimal in griglia DevExpress WPF

Colonna per visualizzare interi senza virgola

dxg:GridColumn FieldName="NPZ_ART_CONF" Header="Paia" >
dxg:GridColumn.EditSettings>
dxe:TextEditSettings >
dxe:TextEditSettings.Mask >
dxe:MaskProperties MaskType="Numeric" EditMask="n"/>
/dxe:TextEditSettings.Mask>
/dxe:TextEditSettings>
/dxg:GridColumn.EditSettings>
/dxg:GridColumn>

in CodeBehind
Dim col As New DevExpress.Wpf.Grid.GridColumn
Dim txt As New DevExpress.Wpf.Editors.Settings.TextEditSettings
Dim mask As New DevExpress.Wpf.Editors.MaskProperties
mask.MaskType = DevExpress.Wpf.Editors.MaskType.Numeric
mask.EditMask = "n"
txt.Mask = mask
col.FieldName = "NPZ_ART_CONF"
col.EditSettings = txt


Colonna per visualizzare date non popolate se dataset risponde campo Null

dxg:GridColumn FieldName="DataScadenza" Header="DataScadenza" >
dxg:GridColumn.EditSettings>
dxe:TextEditSettings >
dxe:TextEditSettings.Mask>
dxe:MaskProperties MaskType="None" EditMask="dd MM yyyy" AutoComplete="None" />
/dxe:TextEditSettings.Mask>
/dxe:TextEditSettings>
/dxg:GridColumn.EditSettings>
/dxg:GridColumn>

in CodeBehind
Dim col As New DevExpress.Wpf.Grid.GridColumn
Dim txt As New DevExpress.Wpf.Editors.Settings.TextEditSettings
Dim mask As New DevExpress.Wpf.Editors.MaskProperties
txt.DisplayFormat = "dd/MM/yyyy"
mask.AutoComplete = DevExpress.Wpf.Editors.AutoCompleteType.None
txt.Mask = mask
col.FieldName = "DataScadenza"
col.EditSettings = txt
GridControl2.Columns.Add(col)



Colonna per visualizzare numeri con 2 decimali

dxg:GridColumn.EditSettings>
dxe:TextEditSettings DisplayFormat="#0.00" >
dxe:TextEditSettings.Mask>
dxe:MaskProperties MaskType="Numeric" />
/dxe:TextEditSettings.Mask>
/dxe:TextEditSettings>
/dxg:GridColumn.EditSettings>
/dxg:GridColumn>

in CodeBehind
col = New DevExpress.Wpf.Grid.GridColumn
txt = New DevExpress.Wpf.Editors.Settings.TextEditSettings
mask = New DevExpress.Wpf.Editors.MaskProperties
mask.MaskType = DevExpress.Wpf.Editors.MaskType.Numeric
txt.Mask = mask
txt.DisplayFormat = "#0.00"
col.FieldName = "Prezzo"
col.EditSettings = txt
GridControl2.Columns.Add(col)

venerdì 17 luglio 2009

Resettare l'ID in una tabella SQL

DBCC CHECKIDENT (tableName, RESEED, 1)

mercoledì 24 giugno 2009

Backup dei DB in SqlServer

Tramite questo script è possibile eseguire il backup di tutti i databasi di SqlServer, meno quelli di sistema ovviamente.


DECLARE @name VARCHAR(50) -- Nome del Database
DECLARE @path VARCHAR(256) -- Cartella destinazione file di backup
DECLARE @fileName VARCHAR(256) -- Nome file di backup
DECLARE @fileDate VARCHAR(20) -- Data file di backup (accodata a @fileName)
DECLARE @SqlStatment VARCHAR(MAX) -- Statement T-SQL che esegue il backup

SET @path = 'F:\TEST\'

SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112)

DECLARE db_cursor CURSOR FOR
SELECT name
FROM master.dbo.sysdatabases
WHERE name NOT IN ('master','model','msdb','tempdb')
ORDER BY name

OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name

WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'Elaborazione backup ' + @name + ' in corso...' + CHAR(13)

SET @fileName = @path + @name + '_' + @fileDate + '.BAK'

SET @SqlStatment = 'BACKUP DATABASE ' + @name + ' TO DISK = ''' + @fileName +
''' WITH NOFORMAT, INIT, NAME = N''' + @name + ' - Completo Database Backup''' + ', SKIP, NOREWIND, NOUNLOAD, STATS = 10'

EXEC (@SqlStatment)
PRINT CHAR(13) + 'Elaborazione backup ' + @name + ' terminata!' + CHAR(13)

FETCH NEXT FROM db_cursor INTO @name
END

CLOSE db_cursor
DEALLOCATE db_cursor

venerdì 12 giugno 2009

ricavare tipo dei campi dal database

Per ricavare il tipo dei campi dal database basta eseguire la seguente procedura

public sub RicavaCampi()
Dim dtType As DataTable = getTables()
For Each row As DataRow In dtType.Rows
If Not row(2).Equals("sysdiagrams") Then
Dim res(3) As String
res(2) = row(2) 'nome della tabella
If res(2).Equals("Categories") Then
Dim dtCol As DataTable = _Connection.GetSchema("Columns", res)
If dtCol.Rows.Count > 0 Then
dim colName as string

dim colType as string
For Each col As DataRow In dtCol.Rows
colName = col("COLUMN_NAME")
colType = col("DATA_TYPE")
Next
End If
End If
End If
Next
end sub



Public Function getTables() As DataTable
_Connection.Open()
If Not IsNothing(_Connection) Then
Dim restriction(3) As String
restriction(3) = "BASE TABLE"
Dim dtTables As DataTable = _Connection.GetSchema("Tables", restriction)

Return dtTables
Else
Throw New Exception("Nessuna Connessione attiva...")
End If
_Connection.Close()
End Function

martedì 14 aprile 2009

Connessione a SqlServer da remoto

E' possibile collegarsi ad un DB SQL Server da remoto tramite la seguente stringa di connessione:


Data Source=190.190.200.100,1433;Network Library=DBMSSOCN;Initial Catalog=myDataBase;User ID=myUsername;Password=myPassword;

E' fondamentale settare il firewall affinchè abiliti l'accesso alla porta 1433.

Convertire un campo DB da float a datetime

Per convertire un campo di un database dal formato float (18.9831) a formato orario (18.59) basta utilizzare la seguente procedura

convert(datetime, (select dateadd(second, op_orachia * 3600, '2000-01-01 00:00:01'))) as OraChiamata

martedì 10 marzo 2009

Personalizzazione di una ComboBox con DataTemplate

Windows Presentation Foundation contiene numerosi controlli volti a caricare informazioni e ad interagire con l'utente che rispecchiano nello stile e nelle funzionalità gli elementi Win32. La libertà è comunque massima così come la personalizzazione nell'interfaccia. Tipica è l'esigenza di una ComboBox che deve essere arricchita non limitandosi al semplice testo, ma mostrando anche immagini per ogni elemento.
L'uso di una ComboBox è piuttosto semplice, così come il suo popolamento mediante una collezione di ComboBoxItem:

ComboBox SelectedIndex="0">
ComboBoxItem> Yellow /ComboBoxItem>
ComboBoxItem> Green /ComboBoxItem>
/ComboBox>


Solitamente però, si utilizzano le funzionalità di binding per caricare automaticamente i dati, anche in formato XML:

Canvas>
Canvas.Resources>
XmlDataProvider x:Key="colors" XPath="/items/item">
x:XData>
items xmlns="">
item color="Red" />
item color="Yellow" />
item color="Blue" />
item color="Green" />
/items>
/x:XData>
/XmlDataProvider>
/Canvas.Resources>
ComboBox SelectedIndex="0" ItemsSource="{Binding Source={StaticResource colors}}"
DisplayMemberPath="@color" />
/Canvas>


Con la proprietà ItemsSource indichiamo qual è la sorgente da utilizzare, mentre con DisplayMemberPath specifichiamo qual è il path (in questo caso l'attributo) da mostrare come testo per ogni item. Possiamo però personalizzare e decidere in dettaglio l'aspetto di ogni item inserendo qualsiasi Visual presente in WPF: controlli, immagini e perfino video. Per fare ciò con la proprietà ItemTemplate possiamo indicare, definendo come risorsa o inline per la solo ComboBox, un DataTemplate da utizzare per ogni item.

ComboBox SelectedIndex="0" IsEditable="true" TextSearch.TextPath="@color"
ItemsSource="{Binding Source={StaticResource colors}}">
ComboBox.ItemTemplate>
DataTemplate>
StackPanel Margin="2" Orientation="Horizontal">
Rectangle Width="25" Height="25" Fill="{Binding XPath=@color}" />
TextBlock FontSize="15" Text="{Binding XPath=@color}" />
/StackPanel>
/DataTemplate>
/ComboBox.ItemTemplate>
/ComboBox>


All'interno di un template lo scope di binding è relativo al singolo item che stiamo caricando, perciò ci è concesso fare riferimento direttamente agli attributi dell'elemento item della sorgente. Nell'esempio disegniamo un rettangolo e una scritta relativi al colore corrente. Una menzione particolare la meritano le proprietà IsEditable e TextSearch.TextPath. La prima indica che la ComboBox è editabile e l'utente può immettere del testo di ricerca. La seconda è una attached property sull'oggetto TextSearch e ci permette di indicare qual è la proprietà sulla quale fare lookup per ogni ricerca che l'utente effettua. E' importante impostare questo path perché personalizzando il layout degli item il motore non è in grado di sapere qual è il testo rappresentativo dell'elemento. Il risultato di questa personalizzazione è il seguente, dove digitando "G" viene automaticamente suggerita la voce "Green".

Aggiungere un Font alle risorse

Per aggiungere un font alle risorse è sufficiente aggiungerlo in una cartella del progetto, e dal controllo settare

FontFamily="Resources\#Onuava"

in questo modo verrà utilizzato questo font anzichè quello di default

Update in SQL, come inserire una datetime

L'update di un campo in SQL si fa così:

UPDATENome_Tabella
SETNome_Colonna = Nuovo_Valore
WHERENome_Colonna = Un_Valore

Per aggiornare più colonne:



UPDATENome_Tabella
SETNome_Colonna1 = Nuovo_Valore1
, Nome_Colonna2 = Nuovo_Valore2
, Nome_Colonna3 = Nuovo_Valore3
WHERENome_Colonna = Un_Valore

Per inserire un valore DateTime:




UPDATENome_Tabella
SETNome_Colonna = convert(datetime,'31122099')
WHERENome_Colonna = Un_Valore

lunedì 9 marzo 2009

Progetto Setup, impostare TextBox Criptato

Tools
The only tool you need is ORCA. ORCA is a Microsoft utility for modifying and validating Windows Installer packages. It is a database tool created for setup authors and administrators who work with the Windows Installer Service. This utility is a part of the Windows Installer SDK download along with other MSI related tools.
You can use ORCA to open and modify MSI packages.
To download and install ORCA, follow these steps:
Visit the SDK Platform Site page to download the Windows Installer SDK. The link to Windows Installer SDK should be on the left hand side frame on the above site.
Click on that link to go to the next page to download Windows Installer SDK, which includes ORCA.
After downloading and installing Windows Installer SDK, go to \Program Files\Microsoft SDK\Bin folder on the machine to look for Orca.msi.
Run Orca.msi by double clicking on it, which is the setup to install ORCA on your machine.
After installing ORCA on your machine, you will be able to right click on any MSI package and open it in ORCA.
Using the code
The first thing to do, is generate our VS.NET setup project and identify our future password textbox. You can see Edit2Property in our example that is EDITA2.


Now, we start to modify the MSI to enable our password text changing attributes for our textbox EDITA2.
First of all, we've to start ORCA and open the MSI file generated by VS.NET, and go to 'Control' table.



Normally, all textboxes are called CustomTextA, and we've to identify our textbox by Property column. In our case, we can see our row, has '7' as attributes. Let's go to see what means this '7'.
The attributes are set in binary format, so '7' is 111. 100 + 10 + 1 and this is 4 + 2 + 1 in decimal format. Now, we can go to control attributes table here and check what attributes are 4,2,1.
We can see that our textbox has the following properties: Enabled, Sunken and Visible. Now, check that there's an advance properties table for textboxes, and there's a Password property with value 2097152.
Now we have to add this property to the initial property value (7). 2097152 + 7 = 2097159, that's our new property value. Set in attributes cell and save the MSI File.
Now, check your MSI, and you could see that our textbox is a password textbox!!!

martedì 10 febbraio 2009

Verificare Administrator della macchina

Per sapere se l'utente attualmente loggato è l'amministratore:


bool IsAnAdministrator()
{

WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}

lunedì 9 febbraio 2009

abilitare la scrittura per una colonna della DxGrid

Per abilitare la scrittura di una colonna della griglia DxGrid della DevExpress è necessario aggiungere al controllo la sezione che gestisce la View e settare la NavigationStyle = CellNavigation.

dxg:GridControl.View>
dxg:GridColumnView NavigationStyle="CellNavigation" Name="GridColumnView" AllowEditing="True">
/dxg:GridColumnView>
/dxg:GridControl.View>


Inoltre se la sorgente dati della griglia viene caricata dinamicamente dobbiamo fare attenzione a non impostare il valore di default della colonna, altrimenti non avremo la possibilità di modificare il contenuto.

dtFiltra.Columns.Add("IsSelected", System.Type.GetType("System.Boolean"))

giovedì 29 gennaio 2009

ContextMenu in WPF

Per aggiungere un ContextMenu ad un bottone basta inserire il seguente Codice.

Per Gestire l'evento click degli elementi basta attivarlo su ogni MenuItem.

Button.ContextMenu>
ContextMenu Padding="0" Margin="0" Name="ContextMenu1">
MenuItem Name="MenuItem1">
MenuItem.Header>
TextBlock Text="Option 1" VerticalAlignment="Center">
/TextBlock>
/MenuItem.Header>
MenuItem.Icon>
Border Background="LightGray" Padding="2">
Image Source="Resources/MSG_Error.png" Width="{StaticResource ImageSize}" Height="{StaticResource ImageSize}">
/Image>
/Border>
/MenuItem.Icon>
/MenuItem>/ContextMenu>
/Button.ContextMenu>

mercoledì 28 gennaio 2009

Posizione di una colonna in una griglia DxGrid

Per calcolare la posizione di una colonna nella griglia DxGrid:

Dim visibleIndex As Integer = DevExpress.Wpf.Grid.GridColumn.GetVisibleIndex(column)

martedì 27 gennaio 2009

DialogResult in WPF

In WPF la logica del DialogResult è leggermente diversa da quella delle WindowsForm, infatti i valori che può assumere una DialogResult sono True o False (False è il predefinito).

In una finestra di dialogo è in genere disponibile un pulsante speciale per l'annullamento, che corrisponde al pulsante la cui proprietà IsCancel è impostata su true. Un pulsante configurato in questo modo consente di chiudere automaticamente una finestra quando un utente lo seleziona o preme ESC. In entrambi i casi, DialogResult rimane false.
In una finestra di dialogo è in genere disponibile anche un pulsante speciale per l'accettazione, che corrisponde al pulsante la cui proprietà IsDefault è impostata su true. Un pulsante configurato in questo modo genererà l'evento Click quando l'utente lo seleziona o preme INVIO. Tuttavia, la finestra di dialogo non verrà chiusa automaticamente e DialogResult non verrà impostata su true. È necessario scrivere manualmente questo codice, in genere dal gestore dell'evento Click per il pulsante predefinito.
Dopo la chiusura di una finestra di dialogo, è possibile ottenere il risultato dal valore restituito dal metodo ShowDialog o controllando la proprietà DialogResult.
DialogResult può essere impostata solo quando un oggetto Window viene aperto chiamando il metodo ShowDialog.
Esempio Apertura ShowDialog:

MyDialog dialog = new MyDialog();
dialog.ShowDialog();
if (dialog.DialogResult.HasValue && dialog.DialogResult.Value)
MessageBox.Show("User clicked OK");
else
MessageBox.Show("User clicked Cancel");


nella Window ShowDialog sono inseriti 2 bottoni (Ok, e Cancel) così gestiti:

Button Width="100" Content="OK" IsDefault="True" Click="ButtonOkClick"/
Button Width="100" Content="Cancel" IsCancel="True"/


e l'evento del bottone OK va ad impostare il valore della ShowDialog:

DialogResult = true;

Aggiungere un'immagine delle risorse in WPF

Per aggiungere un'immagine contenuta nelle risorse del progetto in WPF basta utilizzare il seguente codice (facendo attenzione ad impostare la proprietà dell'immagine Build Action a Resources)


pctIcon.Source = New BitmapImage(New Uri("Resources/MSG_OK.png", UriKind.Relative))

Attenzione, se l'oggetto nel quel vogliamo inserire l'immagine è in una sottocartella rispetto alla root, per accedere alle risorse è necessario aggiungere una / prima dell'indirizzo dell'immagine.
es.

pctIcon.Source = New BitmapImage(New Uri("/Resources/MSG_OK.png", UriKind.Relative))

lunedì 26 gennaio 2009

Funzione VBScript che dato un indirizzo E-mail testa se è valido o meno.

If isValidEMail("IndirizzoE-Mail") Then
MsgBox("Indirizzo valido")
Else
MsgBox("Indirizzo non valido")
End If

function IsValidEmail(email)
isitvalid = true
dim names, name, i, c
names = Split(email, "@")
if UBound(names) <> 1 then
isitvalid = false
exit function
end if
for each name in names
if Len(name) <= 0 then
isitvalid = false
exit function
end if
for i = 1 to Len(name)
c = Lcase(Mid(name, i, 1))
if InStr("abcdefghijklmnopqrstuvwxyz_-.", c) <= 0 and not IsNumeric(c) then
isitvalid = false
exit function
end if
next
if Left(name, 1) = "." or Right(name, 1) = "." then
isitvalid = false
exit function
end if
next
if InStr(names(1), ".") <= 0 then
isitvalid = false
exit function
end if
i = Len(names(1)) - InStrRev(names(1), ".")
if i <> 2 and i <> 3 then
isitvalid = false
exit function
end if
if InStr(email, "..") > 0 then
isitvalid=false
Exit Function
end If
IsValidEmail = isitvalid
End Function

venerdì 23 gennaio 2009

Inviare una e-mail tramite VBScript

Per inviare una e-mail tramite linguaggio VBScript utilizzare il seguente codice:

Dim SendMail Set SendMail = CreateObject("CDO.Message")
SendMail.From = "Indirizzo del mittente"
SendMail.To = "Indirizzo del Destinatario"
SendMail.Subject = "e-mail di prova inviata con un VBScript"
SendMail.HTMLBody = "Inserire qui il testo del messaggio con i Tag HTML"
SendMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
SendMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "indirizzo smtp del server di posta"
SendMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = "25" SendMail.Configuration.Fields.Update
SendMail.Send

giovedì 22 gennaio 2009

Expander WPF

Per far funzionare corretamente un Expander WPF è sufficiente metterlo all'interno di una griglia, in una riga la cui height è impostata ad "Auto":

Grid>
Grid.RowDefinitions>
RowDefinition Height="Auto"/>
RowDefinition />
/Grid.RowDefinitions>
Expander Header="Exp di prova">
StackPanel>
TextBox />
Button Content="Ciao" />
/StackPanel>
/Expander>
Button Content="Fuori dall'expander" Grid.Row="1" Height="25" />
/Grid>

venerdì 9 gennaio 2009

Aggiungere un CheckBox Column ad un DXGrid (DevExpress) WPF

per aggiungere una colonna di checkbox in una griglia DXGrid basta inserire un codice:


my:GridColumn FieldName="ImportThis" Header="Import" Width="60"
my:GridColumn.CellTemplate
DataTemplate
CheckBox IsChecked="{Binding Path=ImportThis}" HorizontalAlignment="Center" /
/DataTemplate
/my:GridColumn.CellTemplate
/my:GridColumn

giovedì 8 gennaio 2009

Passare stringa di valori come parametro di una query

E' possibile che ci sia la necessità di passare ad una query una serie di parametri in formato stringa concatenata.
per risolvere la questione ecco come ricavare i vari valori:
In SqlServer:
SELECT *
FROM t
WHERE (',' + @ElencoIdSedi + ',') LIKE ('%,' + ltrim(rtrim(str(t.IdSede))) + ',%')

In MySQL:
SELECT *
FROM t
where concat(',', ElencoIdSedi,',') LIKE concat('%,', t.IdSede, ',%') ;

mercoledì 17 dicembre 2008

aggiungere una ButtonColumn al controllo Xceed Datagrid WPF

Per aggiungere una colonna a tale controllo (gratuita la versione 2.0) WPF è sufficiente inserire nella dichiarazione delle colonne il seguente codice

xcdg:Column FieldName="FieldName" Title="Elimina Riga" ReadOnly="False"
xcdg:Column.CellContentTemplate
DataTemplate
Button Content="Elimina" Click="btnEliminaRiga_Click"
/Button
/DataTemplate
/xcdg:Column.CellContentTemplate
/xcdg:Column


Non è possibile non inserire il FieldName della colonna.

mercoledì 5 novembre 2008

IIS7 e Skype

Se installiamo Skype con le impostazioni di default non è possibile avviare il Default Web Site montato su IIS7 (per le altre versioni non ho verificato).
Il motivo è che entrambi tentano di utilizzare la porta 80 della macchina.
Per risolvere il problema è sufficiente disattivare l'utilizzo di tale porta in Skype in Opzioni Avanzate Connessione, spuntando il flag "Usa le porte 80 e 443 come alternative per le connessioni in ingresso".

mercoledì 29 ottobre 2008

Utente SuperAdmin in Vista

Ho appena apprese che in Vista l'utente Administrator... non è l'amministratore a tutti gli effetti.
Infatti è possibile attivare un utente SuperAdministrator per svolgere particolari operazioni.
Per attivarlo da Menù Start/Accessori cliccare con il tasto destro su Prompt dei Comandi e selezionare Esegui come Amministratore. Si aprirà il promt dei comandi, digitare:
net user administrator /active:yes
e riavviare.
all'avvio di windows troveremo anche l'utente Administrator con il quale è possibile svolgere anche le più particolari funzioni.
Per disattivare l'utente digitare dal prompt dei Comandi:
net user administrator /active:no

venerdì 17 ottobre 2008

Proprietà della Classe Win32_Printer

Class properties:
Win32_Printer.Attributes
Win32_Printer.Availability
Win32_Printer.AvailableJobSheets
Win32_Printer.AveragePagesPerMinute
Win32_Printer.Capabilities
Win32_Printer.CapabilityDescriptions
Win32_Printer.Caption
Win32_Printer.CharSetsSupported
Win32_Printer.Comment
Win32_Printer.ConfigManagerErrorCode
Win32_Printer.ConfigManagerUserConfig
Win32_Printer.CreationClassName
Win32_Printer.CurrentCapabilities
Win32_Printer.CurrentCharSet
Win32_Printer.CurrentLanguage
Win32_Printer.CurrentMimeType
Win32_Printer.CurrentNaturalLanguage
Win32_Printer.CurrentPaperType
Win32_Printer.Default
Win32_Printer.DefaultCapabilities
Win32_Printer.DefaultCopies
Win32_Printer.DefaultLanguage
Win32_Printer.DefaultMimeType
Win32_Printer.DefaultNumberUp
Win32_Printer.DefaultPaperType
Win32_Printer.DefaultPriority
Win32_Printer.Description
Win32_Printer.DetectedErrorState
Win32_Printer.DeviceID
Win32_Printer.Direct
Win32_Printer.DoCompleteFirst
Win32_Printer.DriverName
Win32_Printer.EnableBIDI
Win32_Printer.EnableDevQueryPrint
Win32_Printer.ErrorCleared
Win32_Printer.ErrorDescription
Win32_Printer.ErrorInformation
Win32_Printer.ExtendedDetectedErrorState
Win32_Printer.ExtendedPrinterStatus
Win32_Printer.Hidden
Win32_Printer.HorizontalResolution
Win32_Printer.InstallDate
Win32_Printer.JobCountSinceLastReset
Win32_Printer.KeepPrintedJobs
Win32_Printer.LanguagesSupported
Win32_Printer.LastErrorCode
Win32_Printer.Local
Win32_Printer.Location
Win32_Printer.MarkingTechnology
Win32_Printer.MaxCopies
Win32_Printer.MaxNumberUp
Win32_Printer.MaxSizeSupported
Win32_Printer.MimeTypesSupported
Win32_Printer.Name
Win32_Printer.NaturalLanguagesSupported
Win32_Printer.Network
Win32_Printer.PaperSizesSupported
Win32_Printer.PaperTypesAvailable
Win32_Printer.Parameters
Win32_Printer.PNPDeviceID
Win32_Printer.PortName
Win32_Printer.PowerManagementCapabilities
Win32_Printer.PowerManagementSupported
Win32_Printer.PrinterPaperNames
Win32_Printer.PrinterState
Win32_Printer.PrinterStatus
Win32_Printer.PrintJobDataType
Win32_Printer.PrintProcessor
Win32_Printer.Priority
Win32_Printer.Published
Win32_Printer.Queued
Win32_Printer.RawOnly
Win32_Printer.SeparatorFile
Win32_Printer.ServerName
Win32_Printer.Shared
Win32_Printer.ShareName
Win32_Printer.SpoolEnabled
Win32_Printer.StartTime
Win32_Printer.Status
Win32_Printer.StatusInfo
Win32_Printer.SystemCreationClassName
Win32_Printer.SystemName
Win32_Printer.TimeOfLastReset
Win32_Printer.UntilTime
Win32_Printer.VerticalResolution
Win32_Printer.WorkOffline

mercoledì 15 ottobre 2008

Progetto d'installazione

Nel progetto d'installazione standard di visual studio è possibile inserire una form personalizzata.
Da Interfaccia Utente del Setup sotto Avvio cliccare su Aggiungi Finestra di Dialogo.
Scegliere il layout desiderato e porre attenzione alla casella delle proprietà.
Per un layout di tipo Caselle di testo, modificare EditLabel (il nome visualizzato per la label) e EditProperty (il nome della proprietà associata a quel campo)
per poter gestire i dati inseriti, ad esempio nell' overrides Install del ProjectInstaller è necessario impostare il CustomActionData. Questo lo troviamo in Azioni Personalizzate del Setup sotto Installa è stato precedentemente aggiunto l'Output Primario che tra le proprietà ha anche il CustomActionData. Per poter effettuare il mapping e necessario aggiungere tutti le \chiavi =valore aggiunte nelle nostre form personalizzate.
ad esempio.
se nella form è stato aggiunto Edit1Property = USER allora nella CustomActionData inserire /USER=[USER] se fossero più d'uno basta aggiungerli separati da spazi (/USER=[USER] /PSW=[PSW])
Per recuperare i valori dal ProjectInstaller inserire
Context.Parameters("USER")

lunedì 13 ottobre 2008

Ancora sui servizi

Per installare un servizio in configurazione Utente anzichè Local Service (o Local System) è necessario modificare la proprietà Account della ServiceProcessInstaller1 uguale a User e impostare Username e Password in ProjectInstaller.Designer.vb come quelle dell'utente che si vuole configurare.
Fondamentale: l'Username deve essere del tipo: NomeServer\Username o Dominio\Username
Per avviare il servizio al termine dell'installazione gestire la AfterInstall della ProjectInstaller (da CodeBehind)

Private Sub ProjectInstaller_AfterInstall(ByVal sender As Object, ByVal e As System.Configuration.Install.InstallEventArgs) Handles Me.AfterInstall

Dim timeout As TimeSpan = TimeSpan.FromSeconds(30)
Dim s As New ServiceProcess.ServiceController("MegaPrintServer")
s.Start()
s.WaitForStatus(ServiceProcess.ServiceControllerStatus.Running, timeout)

End Sub


mercoledì 24 settembre 2008

Creare un servizio Windows con C#

Un Windows Service (in italiano detto anche Servizio) è un'applicazione che gira in background all'interno di Windows. L'applicazione viene poi gestita da uno snap-in disponibile nel MMC di gestione del sistema sotto "Services and Applications/Service" il quale permette di impostare la modalità con cui il servizio parte, l'account con cui questo programma gira (LOCAL SERVICE o NETWORK SERVICE ad esempio), i parametri che possono essere passati in fase di lancio, le operazioni da compiere nel caso in cui il lancio del programma non vada a buon fine, ecc.
L'applicazione da trasformare in servizio, si occupa di controllare una casella email per la ricezione di richieste d'intervento che vengono poi filtrate in base al mittente ed inserite nel database del sistema gestionale per poi essere visualizzate poi tramite interfaccia web.Inizialmente l'applicazione veniva avviata automaticamente al login di un utente ed eseguita in background. Naturale evoluzione e' quindi quella di trasformarla in servizio in modo che possa venir avviata anche senza effettuare il login di un utente.
Per fare cio, occorre selezionare il template "Windows Service"

public partial class service1 : ServiceBase
{
public service1()
{
// Costruttore.
}
protected override void OnStart(string[] args)
{
// Codice eseguito all'avvio del servizio.
}
protected override void OnStop()
{
// Codice eseguito al termine del servizio.
}
}

Il metodo OnStart verra' chiamato ogni volta che il servizio verra' avviato (Manualmente o Automaticamente a seconda di come e' stato impostato), tramite il parametro args recuperiamo i parametri che decidiamo di passargli al momento dell'avvio (Nella finestra di configurazione dei servizi e' possibile impostare i parametri di avvio). Ad esempio nel metodo OnStart possiamo attivare un Timer per l'esecuzione del nostro codice.
Ora dobbiamo aggiungere l'installer che si occupa di installare l'applicazione come servizio. Per fare cio' dobbiamo andare in modalita' Design sulla classe che contiene il servizio, nel nostro caso service1, tasto destro e poi Add Installer
Tramite l'installer possiamo definire nelle sue proprieta' le credenziali con cui dovra' partire il servizio: in particolar modo il tipo di account (LocalSystem)
Possiamo ora aggiungere un progetto per il setup alla nostra soluzione. Andiamo quindi su File -> Add -> New Project... e selezioniamo "Setup and Deployment" -> "Setup Project" Ora dobbiamo specificare quali file devono essere aggiunti al setup e dove andranno messi (di default) sul computer dove girera' la nostra applicazione. Clichiamo con il tasto destro su Application Folder e poi selezioniamo Add -> Project Output...:
Da questa finestra selezioniamo l'output del nostro progetto, in questo modo quando effettueremo il build della soluzione, l'eseguibile della nostra applicazione verra' inserito all'interno del setup.
Ora associamo il progetto di setup al progetto della nostra applicazione. Per fare questo dobbiamo cliccare su Setup nella finestra Solution Explorer: sulla barra di tale finestra compariranno delle nuove icone, clicchiamo su Custom Actions Editor.
Aperta la finestra di dialogo relativa a Custom Actions Editor dobbiamo cliccare su Application Folder e successivamente selezionare Primary output from [Your service] (Active)Fatto questo siamo pronti per compilare ed installare il servizio.

mercoledì 3 settembre 2008

Caricare un'immagine e modificarla

Se vogliamo visualizzare un'immagine, e rivisualizzarla in seguito ad una modifica dobbiamo stare attenti alla cache che si ricorda la vecchia immagine e non tiene conto della modifica.
Un metodo potrebbe essere quello di caricare l'immagine e postporre un parametro casuale, in modo da far ricaricare ogni volta l'immagine.
Ad esempio:


Image1.ImageUrl = "~/img/immagine.jpg?t=" + DateTime.Now.Ticks.ToString

in Questo modo l'immagine viene ricaricata ogni volta... comprese le modifiche ;)

Il DefaultButton, una questione importante

Scrivendo la mia applicazione ho trovato non pochi problemi con il bottone di default.
Infatti se non viene impostato per default al click dell'invio viene attivato il primo bottone trovato nella pagina.
Il metodo che ho utilizzato per ovviare a questo problema è questo:

inserire dei Panel, e nella dichiarazione utilizzare il

defaultbutton="idButtonDesiderato"

in questo modo gestisco in maniera granulare il bottone di default.

martedì 26 agosto 2008

WebPart e IIS

Per il corretto funzionamento delle WebPart, l’applicazione deve essere impostata con
authentication mode="Forms"
In questo modo, sulla prima pagina del sito dobbiamo gestire l’utente da caricare nei cookie.
Ad Esempio

Dim userData As String = "ApplicationSpecific data for this user."
Dim ticket As FormsAuthenticationTicket = New FormsAuthenticationTicket(1, _
"username", _
DateTime.Now, _
DateTime.Now.AddMinutes(30), _
True, _
userData, _
FormsAuthentication.FormsCookiePath)
' Encrypt the ticket.
Dim encTicket As String = FormsAuthentication.Encrypt(ticket)
' Create the cookie.
Response.Cookies.Add(New HttpCookie(FormsAuthentication.FormsCookieName, encTicket))


L’IIS 7 deve essere impostato in modo da avere abilitate:
Autenticazione Anonima: Abilitato
Autenticazione basata su Form: Abilitato
Autenticazione di base: Disabilitato
Rappresentazione ASP.NET: Abilitato

L’IIS 5 deve essere impostato in modo da avere abilitate:

Accesso Anonimo: abilitato, il nome utente (ad esempio): IUSR_ServerTest e password quella di default, comunque quelli di default entrambi.
Autenticazione di Base: Disabilitato
Autenticazione Integrata di Windows: Abilitato

Paging e Sorting di un GridView

Con questi metodi è possibile gestire il paging e il sorting di un GridView non collegato ad un DataSource.

Private Property GridViewSortDirection() As String
Get
Return IIf(ViewState("SortDirection") = Nothing, "ASC", ViewState("SortDirection"))
End Get
Set(ByVal value As String)
ViewState("SortDirection") = value
End Set
End Property


Private Property GridViewSortExpression() As String
Get
Return IIf(ViewState("SortExpression") = Nothing, String.Empty, ViewState("SortExpression"))
End Get
Set(ByVal value As String)
ViewState("SortExpression") = value
End Set
End Property


Private Function GetSortDirection() As String
Select Case GridViewSortDirection
Case "ASC"
GridViewSortDirection = "DESC"
Case "DESC"
GridViewSortDirection = "ASC"
End Select
Return GridViewSortDirection
End Function


Protected Function SortDataTable(ByVal dataTable As DataTable, ByVal isPageIndexChanging As Boolean) As DataView
If Not dataTable Is Nothing Then
Dim dataView As New DataView(dataTable)
If GridViewSortExpression <> String.Empty Then
If isPageIndexChanging Then
dataView.Sort = String.Format("{0} {1}", GridViewSortExpression, GridViewSortDirection)
Else
dataView.Sort = String.Format("{0} {1}", GridViewSortExpression, GetSortDirection())
End If
End If
Return dataView
Else
Return New DataView()
End If
End Function

Nell'evento Paging viene passato al SortDataTable il datasource della griglia, che molto probabilmente sarà vuoto. E' conveniente salvare precedentemente il datasource nel viewState e poi passare tale campo al SortDataTable


Protected Sub gridAgenti_PageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles gridAgenti.PageIndexChanging
Try
gridAgenti.DataSource = SortDataTable(gridAgenti.DataSource, True)
gridAgenti.PageIndex = e.NewPageIndex
gridAgenti.DataBind()
Catch ex As Exception
Session.Remove("Exception")
Session.Add("Exception", ex)
Response.Redirect("ErrorPage.aspx")
End Try
End Sub

Protected Sub gridAgenti_Sorting(ByVal sender As Object, ByVal e As GridViewSortEventArgs) Handles gridAgenti.Sorting
GridViewSortExpression = e.SortExpression
Dim pageIndex As Integer = gridAgenti.PageIndex
gridAgenti.DataSource = SortDataTable(gridAgenti.DataSource, False)
gridAgenti.DataBind()
gridAgenti.PageIndex = pageIndex
End Sub