C# : Créer rapidement un événement

Fiche mémo pour créer rapidement un événement lancé d’une classe, et abonnement à cet event.
Etapes de création d’un événement customisé complet (C#):

  • 1- DANS LA CLASSE SOULEVANT L’EVENEMENT
  • Delegate :
    public delegate void MonHandler(object sender, MonEventArgs e);
  • L’événement lui-même:
    public event MonHandler On_QuelqueChoseSePassed;
  • Classe « MonEventArgs » :
    public class MonEventArgs : EventArgs
        {
            private int _iInformation1;
            private string _sInformation2;
            internal MFluxEventArgs(int iInfo1, string sInfo2)
            {
                _iInformation1 = iInfo1;
                _sInformation2 = sInfo2;
            }
            public int Information1
            {
                get { return _iInformation1; }
            }
            public string Information2
            {
                get { return _sInformation2; }
            }
        }
  • Fonction qui lance l’événement :
        private void FireQuelqueChoseSePassed(MonEventArgs e)
        {
            if (On_QuelqueChoseSePassed != ')
            {
                On_QuelqueChoseSePassed(this, e);
            }
        }

 

  • Maintenant, dans mon code, je vais avertir quand quelque chose se passe :

    ...
    FireQuelqueChoseSePassed(new MFluxEventArgs(15, "On est ici"));
    ...
  • 2- AILLEURS, on souhaite s’abonner à l’événement :
  • On abonne une fonction de la même signature que le delegate :

    MaClasse.On_QuelqueChoseSePassed +=new MaClasse.MonHandler(LaFonctionQuiVaRecevoirLEvent);
  • La fonction abonnée :

    protected void LaFonctionQuiVaRecevoirLEvent(object sender, MonEventArgs e)
    {
    // Ici, on peut utiliser "sender" (objet MaClasse instancié), ou "e" (qui contient un entier et un string...)
    }

SQL SERVER : Désactiver les contraintes sur une table.

La commande est celle-ci :
ALTER TABLE ma_table NOCHECK CONSTRAINT ALL
Pour désactiver TOUTES les contraintes de TOUTES les tables :
exec sp_MSforeachtable ’ALTER TABLE ? NOCHECK CONSTRAINT ALL’
Pour tout remettre d’équerre :
exec sp_MSforeachtable ’ALTER TABLE ? CHECK CONSTRAINT ALL’
A noter que ça marche aussi pour désactiver les triggers : ALTER TABLE ma_table DISABLE TRIGGER ALL, puis faire ENABLE pour les réactiver.
Source sur SQLServer Magazine.

Tips pour SSIS (SQL Server Integration Services)

L’héritier des lots DTS donne du fil à retordre…

    • Erreurs lors de la lecture d’un fichier plat : « LocaleID xx n’est pas installé… ».
      –> Solution : Eviter les fichiers plats de type CSV. Renommer les CSV en TXT, et ca va marcher.
    • Erreur 0xC02020A1 : « Erreur de conversion » lorsqu’on essaie d’intégrer les données d’un fichier plat vers une autre source de données.
      –> Solution : Il faut bien vérifier la taille des colonne importées. Sinon faire un clic-droit sur le composant de flux de données, puis « Afficher l’éditeur avancé > Propriétés d’entrée de de sortie > Sortie de source de fichier plat > Colonnes de sortie ». Choisir les colonnes qui plantent, et changer le paramètre TruncationRowDisposition à « RD_IgnoreFailure ».
      –> Risque : les données tronquées seront simplement notifiée.
    • Le composant de flux de données pour filtrer des données est le « Fractionnement conditionnel ».

To be continued...

.NET : Le bon encodage

Bien définir la balise « Globalization » du web.config.
Diantre, votre page web s’affiche, mais les caractères spéciaux sont de vraies hiéroglyphes. En .NET, la solution se cache souvent dans un web.config mal… configuré :
<globalization requestEncoding="ISO-8859-15" responseEncoding="ISO-8859-15" fileEncoding="ISO-8859-15" culture="fr-FR" uiCulture="fr-FR" />

MOSS 2007 : Restaurer une liste ne restaure pas les ID des enregistrements !

Catastrophe : vos identifiants d’items de liste n’ont plus rien à voir avec ceux d’antan !
Imaginons qu’une liste contient des enregistrements qui sont référencés par d’autres listes via leur champ ID (champ présent dans toute liste).
Maintenant restaurons cette liste (pour une raison lambda).
Bam ! Là, c’est le drame.Les ID ne sont pas restaurés… C’est une colonne auto-increment, donc les nouveaux ID reprendront là ou le dernier enregistrement s’était arrêté.
Tous les liens vers les autres listes sont cassés…
Moralité : éviter les liens vers cette colonne ID (autant créer son propre champ identifiant).
Solution 1 : Faire des UPDATE AllUserData SET ID = 111 etc. pour remettre d’équerre tous ces ID (bon courage)
Solution 2 : Je ne la connais pas encore, mais il y a sans doute moyen de forcer à quel ID commencer. En supprimer la liste, et en la recréant… A voir.

BATCH : Codes retour (errorlevel )

Dans un fichier .bat, il est souvent nécessaire de retourner un code erreur afin de vérifier son bon fonctionnement.
A la fin du fichier, il suffit d’entrer la commande exit /b number
errorlevel est une instruction qui retourne le code erreur le plus élevé retourné durant l’exécution du batch.
En faisant if errorlevel 3 exit /b 3, on teste si il y a eut une erreur durant le script, et on sort avec ce même code erreur
Le code complet serait :

if errorlevel 3 exit /b 3
if errorlevel 1 exit /b 1
if errorlevel 0 exit /b 0

ATTENTION, si le code erreur est 3, alors errorlevel 3 renvoie vrai, mais aussi errorlevel 2 ou 1, ou 0 !
Errorlevel renvoie VRAI si le code erreur est inférieur ou égal au nombre.

T-SQL : Boucler sur un curseur

Etant donné que j’oublie à chaque fois cette structure de code, je la placeune fois pour toute :

DECLARE @ma_var1 VARCHAR(255), @ma_var2 VARCHAR(255)
DECLARE mon_curseur CURSOR FOR
   SELECT col1, col2 FROM ma_table
OPEN mon_curseur
FETCH NEXT FROM mon_curseur INTO @ma_var1, @ma_var2
WHILE @@FETCH_STATUS = 0
BEGIN
   FETCH NEXT FROM mon_curseur INTO @ma_var1, @ma_var2
END
CLOSE mon_curseur
DEALLOCATE mon_curseur