in

DotNetSide

Dot Net South Italy Developers User Group

Tips

  • Verificare se un anno è bisestile

    Autore: Vito Arconzo

    Spesso è necessario conoscere se un anno sia bisestile.
    Con VB.NET è molto semplice in quanto, il problema, è stato risolto alla fonte: è fornito un opportuno metodo, IsLeapYear, che accetta in input un valore intero (l'anno) e restituisce un valore booleano (True = bisestile, False = non bisestile).

    Per provare questa funzione, creare una form, aggiungere due TextBox di nome rispettivamente TextBox1 e TextBox2 ed un pulsante e infine, nell'evento Click del pulsante inserire il seguente codice:

     
    1      If TextBox1.Text = "" Then
    2 TextBox2.Text = "anno non indicato"
    3 Else
    4 If
    (DateTime.IsLeapYear(Integer.Parse(TextBox1.Text)) = True) Then
    5 TextBox2.Text = "Anno " & TextBox1.Text & " bisestile."
    6 Else
    7 TextBox2.Text = "Anno " & TextBox1.Text & " NON bisestile."
    8 End If
    9 End If

     
    Posted Jun 22 2006, 11:28 AM by VitoA with no comments
    Filed under:
  • Verificare se l'applicazione è già in esecuzione

    Autore: Fabio Cozzolino

    Verificare se l'applicazione è già in esecuzione

    Spesso mi viene chiesto: come posso fare per verificare se il mio programma è già in esecuzione?

    Una possibile soluzione è l'utilizzo della classe Mutex del namespace System.Threading. Mutex verifica che in esecuzione esista un unico thread in base al nome passato come parametro stringa.

    Un esempio in Visual Basic .NET:

    1    Private Shared m As Mutex
    2
    3 Private Shared Sub Main()
    4 Dim first As Boolean
    5
    6 m = New Mutex(true, Application.ProductName, first)
    7 if (first) then
    8 Application.Run(new MainForm())
    9 m.ReleaseMutex()
    10 else
    11 MessageBox.Show("Applicazione già in esecuzione")
    12 end if
    13 End Sub
     
    Posted Jun 21 2006, 10:16 AM by VitoA with no comments
    Filed under:
  • Creazione di una stringa di connessione

    Autore: Vito Arconzo

    Ecco un comodissimo metodo (poco documentato) per la creazione di una stringa di connessione di qualsiasi tipo:

    • Creare un file di testo chiamato test.udl (in qualsiasi posizione);
    • Doppio click sul file appena creato;
    • Apparirà un wizard molto familiare, è lo stesso utilizzato da VS e tools vari in fase di creazione di stringhe di connessione;
    • Configurare la connessione al database utilizzando il provider che vi serve.

    Una volta terminata la creazione guidata e, naturalmente, confermata cliccando sul pulsanto OK, è possibile aprire il file udl con il notepad e, magia, all'interno troviamo la stringa di connessione pronta per essere copiata ed utilizzata a nostro piacimento.

    Posted Jun 12 2006, 10:12 AM by VitoA with no comments
    Filed under:
  • Invertire una stringa

    Autore: Vito Arconzo

    Questa funzione restituisce la stringa passata come parametro invertita.

    1    Public Function ReverseString(ByVal stringToReverse As String) As String
    2 ' dichiarazione variabili

    3 Dim s As String = ""
    4 Dim lunghezza As Integer = 0
    5 If stringToReverse = "" Then
    6 ' se stringa vuota restituiscila
    7 s = ""
    8 Else
    9 ' altrimenti esegui l'inversione della stringa
    10 lunghezza = stringToReverse.Length
    11 For i As Integer = (lunghezza - 1) To 0 Step -1
    12 s = String.Concat(s, stringToReverse.Substring(i, 1))
    13 Next
    14 End If
    15 Return
    (s)
    16 End Function
     
    Posted Jun 09 2006, 09:55 AM by VitoA with 1 comment(s)
    Filed under:
  • Interfaccia Inserimento e ReadOnly

    Autore: Francesco Guadagno

    Molto spesso mi son trovato difronte al semplice “problema” di dover gestire una interfaccia o form di inserimento, nella doppia modalità Inserimento e sola visualizzazione.

    Il problema, se pur semplice, ci costringe a iterare sulle varie proprietà “ReadOnly” ed “Enabled” dei vari controlli impostando il valore che ci serve in quel momento.

    Se sfruttiamo la ControlCollection di un qualsiasi WebControl, è possibile fare qualcosa di questo tipo:

    1    public static void EnableFields(Control c, bool bEnabled){
    2        foreach (Control c1 in c.Controls){
    3            string sType = c1.ToString();
    4            switch (c1.ToString()){
    5                   case "System.Web.UI.WebControls.TextBox":
    6                        ((TextBox)c1).Enabled = bEnabled;
    7                        break;
    8                   case "System.Web.UI.WebControls.DropDownList":
    9                        ((DropDownList)c1).Enabled = bEnabled;
    10                       break;
    11                  case "System.Web.UI.WebControls.CheckBox":
    12                       ((CheckBox)c1).Enabled = bEnabled;
    13                       break;
    14                  case "System.Web.UI.WebControls.ListBox":
    15                       ((ListBox)c1).Enabled = bEnabled;
    16                       break;
    17             }
    18             if (c1.HasControls()){
    19                  EnableFields(c1, bEnabled);
    20             }
    21       }
    22   }
    

    Si tratta di una funzione ricorsiva che accetta in input un qualsiasi controllo, ad esempio la tabella che contiene tutti i webcontrols, e che ripete la procedura per ogni controllo trovato nella ControlCollection.

    Le operazioni effettuabili sono le più disparate. Possiamo in questo modo pensare di gestire anche problematiche come visibilità, abilitazioni di Validator,Reset form, ecc.

    Posted Jun 08 2006, 01:03 PM by VitoA with no comments
    Filed under:
  • StringBuilder vs Concatenamento

     

    Autore: Michele Locuratolo

    Mi capita spesso che mi venga richiesto come fare per migliorare le performance di una applicazione e, altrettanto spesso, scopro che viene usato il semplice concatenamento di stringhe per comporre dei messaggi. Si va dal semplice messaggio di poche parole (che concatena 4 o 5 stringhe) a veri e propri testi.
    Questo modo di fare causa spesso problemi di performance. Scopriamo insieme il perchè.
    Usiamo allo scopo questo semplice codice:

     string myString = string.Empty;
     
    for (int i = 0; i < 10000; i++) {
         myString += i.ToString();
     }

    Il funzionamento è estremamente semplice: la nostra stringa sarà il risultato del concatenamento di 10.000 numeri.
    Internamente però, questa operazione è decisamente pesante. Partendo dal concetto che una stringa è un oggetto immutabile e che, ad ogni modifica di essa, ne deve essere creata una copia che contiene il nuovo valore, non è difficile immaginare cosa accade all'interno del nostro ciclo.
    Al primo "giro", verrà creata una nuova stringa che conterrà il valore precedente (string.Empty) ed il nuovo (0). Al secondo cliclo, ancora una volta, verrà creata una nuova stringa che contenente il valore precedente ed il nuovo (1) e così via. Ne consegue che, per 10.000 cicli, verranno create 10.000 stringhe! Tutte le stringhe precedenti vengono poi eliminate dal Garbage Collector.
    Se mandiamo in esecuzione il codice di sopra aggiungendo un paio di timer, otterremo il seguente risultato:

    Avvio ciclo di concatenamento
    Tempo impiegato: 00:00:00.5107344

    Praticamente 1/2 secondo per concatenare 10.000 stringhe. Apparentemente potrebbe sembrare poco ma vediamo cosa accade usando un oggetto realizzato apposta per questo scopo: lo StringBuilder:

     StringBuilder sb = new StringBuilder(10000);
     
    for (int i = 0; i < 10000; i++) {
         sb.Append(i.ToString());
     }

    Grazie a questo oggetto, il concatenamento non avviene più creando una copia della stringa. StringBuilder contiene un vettore di caratteri ed il concatenamento avviene direttamente sul vettore evitando inutili copie di oggetti. Se mandiamo in esecuzione il codice otterremo:

    Avvio ciclo con StringBuilder
    Tempo impiegato: 00:00:00.0100144

    50 volte più veloce! Ma la velocità è solo la minima conseguenza. Se usiamo un tool come CLR Profiler (esiste sia per la versione 1.1 che 2.0 del framework), possiamo vedere quanto sia più pesante da eseguire il primo codice rispetto al secondo. Di seguito un report:

      Concatenamento StringBuilder
    Allocated bytes:
    Relocated bytes:
    Final Heap bytes:
    Objects finalized:
    Critical objects finalized:
    Gen 0 collections:
    Gen 1 collections:
    Gen 2 collections:
    Induced collections:
    Gen 0 Heap bytes:
    Gen 1 Heap bytes:
    Gen 2 Heap bytes:
    Large Object Heap bytes:
    Handles created:
    Handles destroyed:
    Handles surviving:
    Heap Dumps:
    Comments:

    379.311.360
    20.536.640
    1.575.328
    0
    0
    449
    47
    0
    0
    847.516
    390.678
    12
    8.784
    27
    0
    27
    0
    0

    544.756
    0
    544.756
    0
    0
    0
    0
    0
    0
    Unknown
    Unknown
    Unknown
    Unknown
    27
    0
    27
    0
    0

    Come è evidente, tanto la memoria allocata quanto il lavoro fatto dal Garbage Collector sono notevolmente ridotti dallo StringBuilder.
    Personalmente, se devo concatenare più di 3 stringhe, uso il secondo codice. Fino a 3, non c'è quasi differenza tra i 2 sistemi.

    Posted Jun 05 2006, 01:17 AM by VitoA with 22 comment(s)
    Filed under:
  • Utilizzo ANSI Jolly in SQL

    Autore: Vito Arconzo

    Se siamo abituati ad utilizzare caratteri jolly ANSI (* e ?), questa funzione converte il caratteri jolly SQL (% e _), quindi, in ANSI.

        Public Function AnsiJolly(ByVal Value As String) As String
            If (Value Is Nothing) Then
                Return String.Empty
            End If

            Value = Value.Replace("*", "%")
            Return Value.Replace("?", "_")
        End Function

    Posted Jun 03 2006, 09:49 AM by VitoA with 3 comment(s)
    Filed under:
  • Convertire una stringa in una DataTable

    Autore: Vito Arconzo

    Questa utilissima funzione permette la conversione di una stringa contenente valori separati da un carattere in  DataTable.

        Public Function StringToTable(ByVal value As String, ByVal delimiter As Char) As DataTable
            Dim table As DataTable = New DataTable
            table.Rows.Clear()
            table.Columns.Clear()
            table.Columns.Add("Value", GetType(String))

            If ((Not value Is Nothing) AndAlso (value.Length > 0)) Then
                Dim text1 As String
                For Each text1 In value.Split(New Char() {delimiter})
                    Dim objArray1 As Object() = New Object() {text1}
                    table.Rows.Add(objArray1)
                Next
            End If

            table.AcceptChanges()
            table = Nothing
            Return table
        End Function

    Posted Jun 03 2006, 01:35 AM by VitoA with 3 comment(s)
    Filed under:
  • Verificare validità numerica di una stringa

    Autore: Giuseppe Russo (Croghen)

    A volte abbiamo la necessità di verificare che un valore sia numerico o meno. Alcune possibilità in C# sono:
    1) Usare try/catch (non performante e poco elegante)
    2) Referenziare Microsoft.VisualBasic.dll, usare quindi IsNumeric (lo farebbe mai uno sviluppatore C# ???)
    3) Riscriversi IsNumeric

    Ecco qui una semplicissima funzione StringIsNumeric che verifica, appunto, che una stringa sia numerica

    public static bool StringIsNumeric(string StringToAnalyze)
    {
        bool bIsNum = true;
        foreach(char cChar in StringToAnalyze.ToCharArray())
        {
            if(cChar < 48 || cChar > 57)
            {
                bIsNum = false;
            }
        }
        return bIsNum;
    }

    Posted Jun 01 2006, 05:42 AM by VitoA with 5 comment(s)
    Filed under:
  • Verificare la presenza di una connessione di rete attiva

    Autore: Michele Locuratolo

    In applicazioni wondows forms, può esserci l'esigenza di verificare la presenza o meno di una connessione di rete attiva. Con il framework 1.1, l'unica soluzione era quella di richiamare, via PInvoke, la Wininet.dll . Nel framework 2.0 la cosa si è molto semplificata grazie al namespace System.Net.NetworkInformation.NetworkInterface che espone un metodo GetIsNetworkAvailable(); che ritorna un bool.

    Questo ci permette, ad esempio usando un timer, di controllare periodicamente lo stato della connessione e di modificare il comportamento del software di conseguenza. Nell'esempio proposto, cambieremo solo una icona nella status bar.
    Il codice è il seguente:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace WindowsApplication2 {
         public partial class Form1 : Form {
             
    bool _NetworkAvailable = false;
                  
    public Form1() {
                        InitializeComponent();
                   }

              private void NetworkTestTimer_Tick(object sender, EventArgs e) {
                   _NetworkAvailable = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
                  
    if (_NetworkAvailable) {
                       
    this.toolStripStatusLabel1.Image = global::WindowsApplication2.Properties.Resources.networkConnections;
                   }
    else {
                       
    this.toolStripStatusLabel1.Image = global::WindowsApplication2.Properties.Resources.none;
                   }
              }
         }
    }

    Il risultato sarà quello mostrato in figura.

    Posted May 30 2006, 05:30 PM by VitoA with 3 comment(s)
    Filed under:
  • SqlParameter - Pulizia dei parametri di una query

    Autore: Vito Arconzo

    Spesso non possiamo o vogliamo utilizzare query parametriche. In queste situazioni utilizzo per avere una semplicissima ma molto efficace funzione che ripulisce e normalizza in valore da inserire in una query.

        Public Shared Function SqlParameter(ByVal Value As ObjectAs String

            Dim 
    sql As String String.Empty

            If 
    ((Value Is NothingOrElse (Value.GetType Is GetType(DBNull))) Then
                
    Value = String.Empty
            End If

            If 
    (Value.GetType Is GetType(String)) Then
                Return 
    ("'" & Value.ToString.Replace("'", "''") & "'")
            
    End If

            If 
    (((((Value.GetType Is GetType(Decimal)) _
            
    Or (Value.GetType Is GetType(Integer))) _
            
    Or (Value.GetType Is GetType(Long))) _
            
    Or (Value.GetType Is GetType(Short))) _
            
    Or (Value.GetType Is GetType(Byte))) Then
                Return 
    Value.ToString.Replace(","c, "."c)
            
    End If

            Return 
    sql

        
    End Function

    L'utilizzo è semplicissimo:

    Dim query As String = "SELECT * FROM clienti WHERE codice=" + SqlParameter(1)

    Anche se questa funzione ripulisce il valore passato alla query, il NON utilizzare query parametriche è una tecnica che può causare problemi di SQL INJECTION e va quindi evitata se non in casi particolari.

    Posted May 30 2006, 08:56 AM by VitoA with no comments
    Filed under:
More Posts « Previous page
Powered by Community Server (Commercial Edition), by Telligent Systems