Procédure stockée (stored procedure) sur MS SQL Server

Une procédure stockée c’est une fonction d’une base de données, avec laquelle des ordres et des instructions peuvent être mis à exécution à une base de données. Elle est par conséquent une commande unique qui exécute des ordres enregistrés.

L’avantage d’une procédure stockée c’est de mettre des instructions beaucoup utilisées d’un client au serveur (base de données) et de les exécuter avec un appel comme EXEC plusieurs fois. En plus, les procédures stockées aident à améliorer la sécurité d’un application, parce que normalement le client n’a plus un droit d’accès sur les commandes delete, update ou insert et donc fait la vie des << attaquants >> beaucoup plus difficile. Les procédures stockées peuvent être écrit en T-SQL sur Microsoft SQL Server.

Voici un exemple pour une procédure stockée simple en T-SQL. Ici on fait un select sur tous les données d’un tableau Customers.

CREATE PROCEDURE selectCustomers
AS
SELECT * FROM Customers
GO


EXEC selectCustomers
--ou simplement
selectCustomers

Jointure – les Joins en SQL

En bref, c’est quoi un JOIN?

Les Joins donnent la possibilité de interroger plusieurs tables à la fois. C’est-à-dire, si je veux voir – par exemple – quel client a commandé quel produit, je ne vais probablement pas trouver ceux informations dans le même tableau (dans un bon design d’un base de données). Du coup, il y a cinq Joins différents pour enchaîner des tableaux.

SQL_Joins.svg

INNER JOIN

Qu’est-ce qui se passe dans le probablement le plus utilisé join – le inner join ? Dans ce cas-là, seulement ceux données sont révélées, qui ont un partenaire dans une autre table. Effectivement c’est difficile à expliquer, c’est pourquoi je monte une graphique qui doit visualiser le concept :

db

Comme on peut remarquer sans difficulté, c’est qu’il y a une relation 1:N parmi le tableau Customer et le tableau Orders. Alors je veux interroger le nom d’un client (CompanyName) et les coûts correspondants (Freight). Voici la syntaxe :

SELECT CompanyName, Freight from Customers c
INNER JOIN Orders o ON c.CustomerID = o.CustomerID

Parce-que j’ai utilisé le inner join, je ne reçois que ceux entrées où les clients (customer) a effectivement fait des commandes. Les clients qui n’ont pas fait une commande n’ont pas de CustomerID dans le tableau Orders. Les commandes qui n’ont pas des clients n’apparaissent non plus – si c’était possible. Le CustomerID est la condition d’évaluation ici.

FULL OUTER JOIN

Pour l’outer join ce n’est pas de problème s’il ne trouve pas un << partenaire >> dans une autre tableau, il liste quand-même toujours tout les données. C’est-à-dire, si dans ma interrogation je veux recevoir aussi ceux clients qui n’ont pas encore fait une commande, je pourrais utiliser l’outer join.

Chaque enregistrement dans le tableau soit à gauche, soit à droite se retrouve dans l’ensemble des éventualités. Si se retrouves un partenaire correspondant en utilisant le critière ON, tout les deux partenaires seront combinés, sinon le côté manquant sera rempli par zero.

Un exemple pour un full out join :

SELECT CompanyName, Freight FROM Customers c
FULL OUTER JOIN Orders o ON c.CustomerID = o.CustomerID
FULL OUTER JOIN [Order Details] od ON od.OrderID = o.OrderID

Avec cette déclaration j’ai quasiment fait un join sur deux tableaux et dans ce cas-là, je recevrais tous les entrées, peu importe que un client a fait fait une commande ou pas. En effet ce n’est pas un avantage, car le plus grand la quantité des données à comparer, de plus élevée est la durée d’une interrogation.

LEFT/RIGHT OUTER JOIN

Dans un left join, les données qui viennent du tableau à la gauche seront en tout cas écrit dans le résultat. Si un ensemble de données, qui vient d’un tableau à la droit, correspond au critière ON, il va être transcrit aux colonnes, sinon les colonnes restent vides, donc NULL. Le right join travaille en sens inverse. Un left ou right join est rien d’autre que un outer join au tableau à gauche ou bien à droite.

CROSS JOIN

Un cross join sans WHERE clause, peut créer un produit cartésien des tableaux participants. C’est-à-dire, la teille du résultat ressamble au montant des lignes dans le premier tableau multiplié avec le montant des lignes dans le deuxième tableau.

Un exemple pour un cross join :

SELECT * FROM Customers
CROSS JOIN Orders

Comme vous avez peut-être déjà remarqué, on n’as pas besoin d’un ON instruction, parce que tout est multiplié par tout. Néanmoins, à cause de sa personalité l’utilisation d’un cross join est plutôt rare.

this en C# n’est pas this en JavaScript

this n’est pas this, au moins dans le monde de la programmation. Dans cet article je jette un coup d’œil sur les différentes possibilités d’utilisations du mot clé this en C# et en JavaScript.

En C# (ou même en Java ou C++) le mot clé this est utilisable dans n’importe quelle méthode d’une classe et fait une référence à l’instance actuelle de cette classe. C’est-à-dire, this représante une classe et peut être utilisé pour assigner des valeurs ou exécuter des méthodes d’une classe. En plus this est souvent utilisé pour créer des indexer ou méthodes d’extension.

Voici quelques exemples pour this en C#:

  • Qualification de membres (privat) par des noms similaires p.ex. dans un constructor d’une classe Person :
public Person(string name, int age)
{
   this.name = name;
   this.age = age;
}
  • Passage d’un objet comme paramètre à d’autres méthodes :
CalcAge(this);

Dans le langage de JavaScript l’utilisation du this est vraiment différent, ce qui peut causer des difficultés parmi les dévelopeurs qui sont habitués à un autre langage comme le C# ou également Java ou C++.

JavaScript est (un peu) différent.

Alors que le JavaScript est un langage orienté objet, le concept est un autre que celui en C#. JavaScript, un langage de Script, utilise une orientation objet prototype. Un objet en JavaScript est un simple système de key-value stockage et ressemble beaucoup à un Dictionary – connu en C#.

  • Un objet en Javascript:
// Créer un objet vide
var person = {};

// Ajouter une property
person.name = "Tino";
person["name"] = "Tino";

…et ou est-ce que se trouve le this finalement?

Le mot this est toujours lié à une fonction en JavaScript et avec cela son scope. Dans ce langage de script on n’utilise pas des classes << traditionnels >>. Il y a le concept de fonctions de constructor (constructor function), qui permettrent de créer des instances avec le mot clé new.

function Person(name){
   this.name = name;
};

// utilisation
var p1 = new Person("Tino");

En JavaScript this est souvent utilisé avec p.ex. that (un mot, libre choix) pour avoir une copie d’une fonctionnalité dans un fonction.

var magic = {
   i: 0,
   foo: function(){
      var that = this;
      var setNumber = function(){
        that.i = 42;
      }
      setNumber();
      console.log(this.i);
   }
}

magic.foo();

JavaScript n’est pas C#, mais c’est définitifement très performant.

Méthode d’extension C# (Extension Methods)

Les méthodes d’extension en C# offrent la possibilité d’ajouter de la fonctionnalité (des méthodes) aux types de données déjà existent dans le langage de programmation C#. L’avantage des méthodes d’extension est que ce n’est pas nécessaire de modifier un type de données ou de créer un nouveau type qui doit hériter d’un type existant. En effet, il n’y a pas de différence entre appeler une méthode d’extension ou d’appeler une méthode qui est définie dans un type de données.

Pour définir et appeler une méthode d’extension en C# il ne faut que respecter les règles suivants :

  1. Définir une classe static visible pour le client et comportant la méthode d’extension (p.ex. public).
  2. Implémenter la méthode d’extension avec la même visibilité que la classe et le mot clé static.
  3. Le premier paramètre de la méthode spécifie le type de donnés qui est élargi. Ce paramètre doit compter le modificateur this.
  4. Dans le code qui appelle la méthode il faut inclure le namespace qui comporte la méthode d’extension.
  5. Appeler les méthodes comme c’était une méthode instance de ce type de donnés.

Dans l’exemple suivant on jette un coup d’œil à la fonctionnalité d’une méthode d’extension lié à la classe String. Le but de cette méthode est de transformer les caractères à ignorer (blankspaces dans ce cas-là) dans un String.

public static class MyStringExtensions
{
  public static string ModifyWhitespaces(this string val)
  {
    return Regex.Replace(val, @"\s+", " ");
  }
}

// utilisation: 
var name = "Tino  !";
name = name.ModifyWhitespaces();