using System.Threading.Tasks; [...] try { Task executeTask = STask.Factory.StartNew(() => DoSomething()); //Wait for 5 minutes int index = System.Threading.Tasks.Task.WaitAny(new[] { executeTask }, TimeSpan.FromSeconds(300)); if (index == -1) { //Task execution Time Out } else { //Task executed in-time } } catch (AggregateException aex) { foreach (Exception ex in aex.InnerExceptions) LogError(ex, ex.Message); } catch (Exception ex) { LogError(ex, "Error"); }
giovedì 20 dicembre 2012
Controllo del timeout su un Task
Ci sono molti modi per verificare se l'esecuzione di un task si conclude entro un periodo di timeout.
Questo è il più semplice ma non per questo meno efficace:
domenica 2 dicembre 2012
Menu da Web.sitemap con separatori
Se si usa il file Web.sitemap per generare automaticamente le voci di menu in Asp.net, si nota subito che tutte le voci sono raggruppate insieme e non è possibile inserire un separatore. Utilizzando il codice di seguito, invece, è possibile.
Nel file Web.sitemap (per ogni node dopo il quale si vuole inserire il sepratatore):
Nel codice:
Nel file Web.sitemap (per ogni node dopo il quale si vuole inserire il sepratatore):
Nel codice:
Protected Sub Menu1_MenuItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MenuEventArgs) Handles Menu1.MenuItemDataBound If e.Item.Text.IndexOf("[sep]") > 0 Then e.Item.Text = e.Item.Text.Replace("[sep]", "") e.Item.SeparatorImageUrl = Page.ResolveUrl("~/Common/images/dividerhoriz.gif") End If Try If Menu1.SelectedItem Is Nothing Then If IsNodeAncestor(CType(e.Item.DataItem, SiteMapNode), System.Web.SiteMap.CurrentNode) Then If e.Item.Selectable Then e.Item.Selected = True End If End If End If Catch ex As Exception 'Exception management End Try End Sub '''''' Determines if a ''' Theis the ancestor of a second one. ''' to analyze. ''' A which may or may not be ''' the 's child. ''' Private Function IsNodeAncestor(ByVal ancestor As SiteMapNode, ByVal child As SiteMapNode) As Boolean Dim result As Boolean = False Try If Not ancestor.ChildNodes Is Nothing AndAlso ancestor.ChildNodes.Contains(child) Then Return True Else If (Not child.ParentNode Is Nothing) AndAlso (Not ancestor Is child.RootNode) Then Return IsNodeAncestor(ancestor, child.ParentNode) End If End If Catch ex As Exception 'Exception management Return False End Try Return result End Function Protected Sub SiteMapPath1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SiteMapNodeItemEventArgs) Handles SiteMapPath1.ItemDataBound If Not e.Item.SiteMapNode Is Nothing Then If e.Item.SiteMapNode.Title.IndexOf("[sep]") >= 0 Then Try e.Item.SiteMapNode.Title = e.Item.SiteMapNode.Title.Replace("[sep]", "") Catch 'Exception management End Try End If End If End Sub true , if the two nodes are related,false otherwise.
sabato 1 dicembre 2012
Fonti per file multimediali
Ho deciso di inserire un post di riferimento per chunque (me compreso) abbia bisogno di foto, clipart, audio, musica o video. Aggiornerò questo post quando troverò nuove risorse.
Icone, Immagini e Foto
The Noun Project
http://thenounproject.com
IconFinder
http://www.iconfinder.com
Icons 8
http://www.icons8.com/
The XAML Project
http://www.thexamlproject.com/
SyncFusion Metro Studio
http://www.syncfusion.com/downloads/metrostudio
266 Icons
http://raphaeljs.com/icons/
Windows 8 App Icons
http://codefoster.com/win8icons
morgueFile
http://www.morguefile.com
iStockphoto
http://www.istockphoto.com
Corbis
http://www.corbis.com
Open Game Art
http://opengameart.org
Audio
freesound.org
http://www.freesound.org/browse
Incompetech
http://incompetech.com/music/royalty-free
Video
Ancora niente...
Icone, Immagini e Foto
The Noun Project
http://thenounproject.com
IconFinder
http://www.iconfinder.com
Icons 8
http://www.icons8.com/
The XAML Project
http://www.thexamlproject.com/
SyncFusion Metro Studio
http://www.syncfusion.com/downloads/metrostudio
266 Icons
http://raphaeljs.com/icons/
Windows 8 App Icons
http://codefoster.com/win8icons
morgueFile
http://www.morguefile.com
iStockphoto
http://www.istockphoto.com
Corbis
http://www.corbis.com
Open Game Art
http://opengameart.org
Audio
freesound.org
http://www.freesound.org/browse
Incompetech
http://incompetech.com/music/royalty-free
Video
Ancora niente...
mercoledì 23 maggio 2012
Convertire un array di classi in DataTable
Utilizzando la Relfection e i Generics è possibile convertire (sarebbe meglio dire trasformare) un qualsiasi array di classi in un DataTable:
Imports System.Reflection
Public Shared Function convertFromClassToDatatable(Of T)(ByVal tableName
As String, ByVal dati As T(), ByVal conIntestazione As Boolean) As DataTable
Dim dt As New DataTable
dt.TableName = tableName
For Each prop As PropertyInfo In GetType(T).GetProperties
dt.Columns.Add(prop.Name)
Next
If
conIntestazione Then
Dim
drIntestazione As DataRow
= dt.NewRow
For Each col As DataColumn In
dt.Columns
drIntestazione.Item(col.ColumnName)
= col.ColumnName.ToUpper
Next
dt.Rows.Add(drIntestazione)
End If
For Each dato As T In dati
Dim dr As DataRow =
dt.NewRow
For Each prop As PropertyInfo In GetType(T).GetProperties
dr.Item(dt.Columns.IndexOf(prop.Name)) = prop.GetValue(dato, Nothing)
Next
dt.Rows.Add(dr)
Next
Return dt
End Function
Utilizzo:
Dim mioArray As miaClasse()
convertFromClassToDatatable("Tabella di prova"),
mioArray, False)
Note:
Siccome vengono utilizzati i Generics, in automatico il sistema sa che classe è "dati", che viene passata alla funzione.
La DataTable risultante avrà TableName = tableName e i vari ColumnName saranno i nomi delle proprietà della classe "miaClasse"
lunedì 16 aprile 2012
Prima lettera maiuscola di ogni parola (Title Case) in SqlServer
Qualche tempo fa ho pubblicato un post (QUI) dove spiegavo come fare il capitalize (ovvero mettere la prima lettera maiuscola e tutto il resto in minuscolo) di una stringa in SQL Server.
Ora voglio integrare quel post mostrando come fare il capitalize di ogni parola della stringa.
Questa attività è un po' più complessa, è infatti necessario creare una funzione personalizzata che farà il lavoro per noi. Ecco come:
CREATE FUNCTION dbo.CapitalizeEveryWord(@input NVARCHAR(4000)) RETURNS NVARCHAR(4000)
AS
BEGIN
DECLARE @position INT
WHILE IsNull(@position,Len(@input)) > 1
SELECT @input = Stuff(@input,IsNull(@position,1),1,upper(substring(@input,IsNull(@position,1),1))),
@position = charindex(' ',@input,IsNull(@position,1)) + 1
RETURN (@input)
END
Fatto questo, basta invocare la funzione ed il gioco è fatto:
SELECT dbo.CapitalizeEveryWord (Lower(NomeColonna)) FROM NomeTabella
giovedì 26 gennaio 2012
Export da SQL Server a Excel
È possibile esportare una tabella db o l'output di una query SQL in excel, magari utilizzando una stored procedure o, comunque, direttamente tramite un comando SQL? La risposta è: SI!
Innanzitutto dobbiamo creare una Stored Procedure che si occupi di fare "il lavoro sporco". Questa SP legge le colonne ed i dati della tabella e crea un file excel con tutti i dati in essa contenuti suddivisi proprio in colonne.
CREATE PROCEDURE proc_generate_excel_with_columns
(
@db_name varchar (100),
@table_name varchar (100),
@file_name varchar (100)
)
AS
--Genera il nome delle colonne
DECLARE @columns varchar(8000), @sql varchar (8000), @data_file varchar (100)
SELECT
@columns=coalesce(@columns+',','')+column_name+' as '+column_name
FROM
information_schema.columns
WHERE
table_name=@table_name
SELECT @columns=''''''+replace( replace (@columns,' as ',''''' as '),',',',''''')
--Crea un file temporaneo per i dati
SELECT @data_file=substring(@file_name,1,len(@file_name)-charindex('\',reverse(@file_name)))+'\data_file.xls'
--Crea le colonne nel file Excel
SET @sql='exec master..xp_cmdshell ''bcp " select * from (select '+@columns+') as t" queryout "'+@file_name+'" -c -T'''
EXEC(@sql)
--Genera i dati nel file temporanep
SET @sql='exec master..xp_cmdshell ''bcp "select * from '+@db_name+'..'+@table_name+'" queryout "'+@data_file+'" -c -T'''
EXEC(@sql)
--Copia il file temporaneo nel file Excel
SET @sql= 'exec master..xp_cmdshell ''type '+@data_file+' >> "'+@file_name+'"'''
EXEC(@sql)
--Cancella il file temporaneo
SET @sql= 'exec master..xp_cmdshell ''del '+@data_file+''''
EXEC(@sql)
Poi bisogna invocare la SP indicando il nome del Database di riferimento, il nome della tabella* ed il percorso del file excel che conterrà i risultati.
EXEC proc_generate_excel_with_columns 'NOME_DB', 'NOME_TABELLA','NOME_FILE'
ATTENZIONE:
Su molti sistemi, per impostazione di default, alcuni comandi utilizzati nella SP sono disattivati. Per attivarli si può utilizzare il seguente comando al posto del precedente:
EXEC master.dbo.sp_configure 'show advanced options', 1
RECONFIGURE
EXEC master.dbo.sp_configure 'xp_cmdshell', 1
RECONFIGURE
EXEC proc_generate_excel_with_columns 'NOME_DB', 'NOME_TABELLA','NOME_FILE'
EXEC master.dbo.sp_configure 'xp_cmdshell', 0
RECONFIGURE
*TIP: Al posto di "Nome_Tabella" è anche possibile inserire il nome di una Vista (View) precedentemente creata oppure di una tabella temporanea
Innanzitutto dobbiamo creare una Stored Procedure che si occupi di fare "il lavoro sporco". Questa SP legge le colonne ed i dati della tabella e crea un file excel con tutti i dati in essa contenuti suddivisi proprio in colonne.
CREATE PROCEDURE proc_generate_excel_with_columns
(
@db_name varchar (100),
@table_name varchar (100),
@file_name varchar (100)
)
AS
--Genera il nome delle colonne
DECLARE @columns varchar(8000), @sql varchar (8000), @data_file varchar (100)
SELECT
@columns=coalesce(@columns+',','')+column_name+' as '+column_name
FROM
information_schema.columns
WHERE
table_name=@table_name
SELECT @columns=''''''+replace( replace (@columns,' as ',''''' as '),',',',''''')
--Crea un file temporaneo per i dati
SELECT @data_file=substring(@file_name,1,len(@file_name)-charindex('\',reverse(@file_name)))+'\data_file.xls'
--Crea le colonne nel file Excel
SET @sql='exec master..xp_cmdshell ''bcp " select * from (select '+@columns+') as t" queryout "'+@file_name+'" -c -T'''
EXEC(@sql)
--Genera i dati nel file temporanep
SET @sql='exec master..xp_cmdshell ''bcp "select * from '+@db_name+'..'+@table_name+'" queryout "'+@data_file+'" -c -T'''
EXEC(@sql)
--Copia il file temporaneo nel file Excel
SET @sql= 'exec master..xp_cmdshell ''type '+@data_file+' >> "'+@file_name+'"'''
EXEC(@sql)
--Cancella il file temporaneo
SET @sql= 'exec master..xp_cmdshell ''del '+@data_file+''''
EXEC(@sql)
Poi bisogna invocare la SP indicando il nome del Database di riferimento, il nome della tabella* ed il percorso del file excel che conterrà i risultati.
EXEC proc_generate_excel_with_columns 'NOME_DB', 'NOME_TABELLA','NOME_FILE'
ATTENZIONE:
Su molti sistemi, per impostazione di default, alcuni comandi utilizzati nella SP sono disattivati. Per attivarli si può utilizzare il seguente comando al posto del precedente:
EXEC master.dbo.sp_configure 'show advanced options', 1
RECONFIGURE
EXEC master.dbo.sp_configure 'xp_cmdshell', 1
RECONFIGURE
EXEC proc_generate_excel_with_columns 'NOME_DB', 'NOME_TABELLA','NOME_FILE'
EXEC master.dbo.sp_configure 'xp_cmdshell', 0
RECONFIGURE
*TIP: Al posto di "Nome_Tabella" è anche possibile inserire il nome di una Vista (View) precedentemente creata oppure di una tabella temporanea
Iscriviti a:
Post (Atom)