FDD Night – Vidéos

Fier d'être développeurAprès trois semaines de vacances, après une semaine (et c’est pas fini) d’optimisations de performances (je tenterais d’en reparler, si j’arrive à organiser le truc !), voici un premier petit billet pour se remettre en selle.

Donc, on commence par relayer les différentes vidéos de la FDD Night.

Et du coup, on pourra aller aussi, directement, sur Youtube, pour revoir toutes les vidéos.

FDD Night

Fier d'être développeur Le 07/10/2014, il y a eut un événement de l’association Fier d’Être Développeur : FDD Night le 7 octobre à 18h15.
J’y était, en voici un petit retour.

Mais avant, deux choses à noter : j’ai commencé le billet durant l’événement, même s’il y a références/relecture/reformulation (du genre pour faire des phrases, c’est bien les phrases), ça reste du « à chaud ». Ensuite, l’application WordPress sur WP8 m’a lâchement lâchée après 335 mots. Après, je ne pouvais plus scroller pour afficher le reste. #tristesse #déception #désappointement comme on dit.

Lire la suite…

Entity Framework et NULL

Décidément, y a des fois où j’ai pas de bol :)

Le scénario est assez simple : j’ai une méthode qui doit aller chercher une ou plusieurs entrées en base de données.
Le critère de recherche est sur un champ nullable.

(Note : c’est la même table que là : ADO.Net Entity Data Model et champs avec valeur par défaut)

Du genre :

public IEnumerable<MATABLE> GetValue(SAMPLESEntities context, string search)
{
    return context.MATABLE.Where(m => m.COLONNE2 == search);
}

Jusque là, rien de bien gênant.
Mais…est si la variable search est nulle ???

Voici la requête exécutée par EF dans le cas de la méthode ci-dessus :

exec sp_executesql N'SELECT 
   [Extent1].[PK] AS [PK], 
   [Extent1].[COLONNE1] AS [COLONNE1], 
   [Extent1].[COLONNE2] AS [COLONNE2], 
   [Extent1].[COLONNE3] AS [COLONNE3], 
   [Extent1].[CREATION] AS [CREATION]
   FROM [dbo].[MATABLE] AS [Extent1]
   WHERE [Extent1].[COLONNE2] = @p__linq__0',
N'@p__linq__0 varchar(8000)',@p__linq__0=NULL

Et voici la requête exécutée si on fait

context.MATABLE.Where(m => m.COLONNE2 == null);
SELECT 
   [Extent1].[PK] AS [PK], 
   [Extent1].[COLONNE1] AS [COLONNE1], 
   [Extent1].[COLONNE2] AS [COLONNE2], 
   [Extent1].[COLONNE3] AS [COLONNE3], 
   [Extent1].[CREATION] AS [CREATION]
   FROM [dbo].[MATABLE] AS [Extent1]
   WHERE [Extent1].[COLONNE2] IS NULL

La différence est notable, non ?
Pourquoi ?
Parce que !
…NULL n’est pas une valeur ! (et c’est pas nouveau ^^)

Il faut donc gérer dans le code C# la possibilité que la variable soit nulle.
Voici un billet bien foutu qui en décrit : NULL value handling in Entity Framework.

A noter, tout de même que l’article parle d’un context (SAMPLESEntities, dans l’exemple) héritant de DbContext. Si le votre hérite de ObjectContext, eh bah c’est mort.
Dans ce cas, il faudra tester la valeur à la main pour réaliser le conditionnement qui va bien.

Un truc du genre :

return string.IsNullOrEmpty(search)
    ? context.MATABLE.Where(m => m.COLONNE2 == null)
    : context.MATABLE.Where(m => m.COLONNE2 == search);
Catégories:.Net, C#, Développement

Documentation Microsoft

Je l’avais vu, mais je n’en avais pas parlé, voilà qui est maintenant chose faite !

Le titre est assez parlant pour ne pas en rajouter : Largest collection of FREE Microsoft eBooks ever.

Catégories:Développement, Microsoft

ADO.Net Entity Data Model et champs avec valeur par défaut

Récemment, j’ai eu un problème lors de l’insertion avec Entity Framework.
Le cas est assez simple : je ne spécifiais pas de valeur sur une colonne non nullable mais ayant une contrainte de valeur par défaut.
Et là, bam : « Impossible d’insérer la valeur NULL dans la colonne ‘[COLONNE]’, table ‘[BASE].[SCHEMA].[TABLE]’. Cette colonne n’accepte pas les valeurs NULL. Échec de INSERT. L’instruction a été arrêtée. »

Donc, ce billet va donner le cas de test et les solutions pour le gérer.

Lire la suite…

Catégories:.Net, C#, Développement

Gestion des exceptions

Je bosse en ce moment sur une application assez âgée.
Elle est un peu dans son troisième âge (> 10 ans) avec un nombre important de personnes ont travaillés dessus (chacun ayant fait à sa sauce).
Comme toute application legacy, il y a beaucoup de choses qui sont à redire.

Dernièrement, on a eu une exception un peu obscure qui nous a donné un peu de fil à retordre.
Le premier réflexe a été de regardé dans le journal d’événements (puisqu’on logue dedans) pour savoir ce qu’il se passait.
Et là, c’est un peu le drame : rien d’exploitable. La StackTrace était tronquée, il n’y avait aucune réelle information…

Après avoir râlé et pesté tout ce que je pouvais (et accessoirement résoudre le problème), il m’a été demandé de faire un état des lieux de la gestion d’exceptions et faire des propositions pour améliorer les choses (la prochaine fois, je penserais à la fermer).

Ce billet est le fruit de ce travail (en plus court), avec tout plein de références.

Lire la suite…

Catégories:Développement, Divers

SQL-Server – RANK et ROW_NUMBER

Récemment, j’ai du faire un petit exercice relativement simple : importer des données en base depuis un fichier CSV.
Avec le bulk insert, c’est assez simple :

BULK INSERT #Bulk
FROM 'C:\Temp\FichierAImporter.csv' 
WITH 
(
	FIELDTERMINATOR = ';',
	ROWTERMINATOR = '\n',
	CODEPAGE = 'ACP',
	ROWS_PER_BATCH = 35000
)

Là où ça s’est compliqué, c’est la génération des identifiants fonctionnels avant leur insertion dans les « vraies » tables.

Pour simplifier un peu, voici le cas.
Je dois importer les nouvelles adresses de clients.
J’ai deux champs : Client et Adresse qui sont chargées depuis le fichier CSV.

Mais surtout, j’ai deux identifiants fonctionnels à créer.
Le premier est un identifiant interne, de la forme « FR00000000″ dont la partie numérique est incrémentée pour chaque entrée. Le prochain identifiant est lisible depuis une table.
Le second identifiant est externe, c’est un numérique incrémenté par client.
C’est à dire que le client #1 possèdant déjà 50 adresses, la suivants sera la 51, la prochaine pour le client #2 est la 6ème.

La bonne vieille méthode, c’est de faire des boucles pour alimenter tout le bazar.
Mais comme on est dans une base de données, c’est quand même nettement mieux de faire de l’ensembliste.
C’est là que RANK et ROW_NUMBER viennent à la rescousse !

Lire la suite…

Suivre

Recevez les nouvelles publications par mail.

Rejoignez 56 autres abonnés