LA CLOCHE

Il y a ceux qui ont lu cette nouvelle avant vous.
Abonnez-vous pour recevoir les derniers articles.
Email
Nom
Nom de famille
Comment voulez-vous lire The Bell
Pas de spam

Un exemple de création d'une base de données locale Microsoft SQL Serveur dansMS Visual Studio

Cette rubrique présente la solution au problème de la création d'une base de données telle que SQL Server à l'aide de MS Visual Studio. Les problèmes suivants sont traités:

  • travailler avec la fenêtre Explorateur de serveur dans MS Visual Studio;
  • créer une base de données locale comme la base de données SQL Server;
  • créer des tables dans la base de données;
  • édition des structures de table;
  • lier les tables de bases de données les unes aux autres;
  • saisie de données dans des tables à l'aide de MS Visual Studio.

La tâche

À l'aide des outils MS Visual Studio, créez une base de données de type MS SQL Server nommée Education. La base de données contient deux tables Student et Session. Les tableaux sont liés les uns aux autres par un champ.

La structure du premier tableau "Student".

La structure du deuxième tableau «Session».

Performance

1. Téléchargez MS Visual Studio.

2. Activezfenêtre Explorateur de serveurs.

Pour travailler avec des bases de données, Microsoft propose un serveur de base de données léger, Microsoft SQL Server. Existe différentes versions Microsoft SQL Server, par exemple: Microsoft SQL Server 2005, Microsoft SQL Server 2008, Microsoft SQL Server 2014 et autres.

Vous pouvez télécharger ces versions à partir du site Web de Microsoft www.msdn.com.

Ce serveur est idéal pour travailler avec des bases de données. Il est gratuit et dispose d'une interface graphique pour créer et administrer des bases de données à l'aide de l'outil de gestion SQL Server.

Tout d'abord, avant de créer la base de données, vous devez activer l'utilitaire Server Explorer. Pour ce faire, dans MS Visual Studio, vous devez appeler (Fig.1)

Affichage -\u003e Explorateur de serveurs

Figure: 1. Appel du serveur Explorateur

Après l'appel, la fenêtre de l'Explorateur de serveurs aura une vue approximative, comme illustré à la figure 2.

Figure: 2. Fenêtre Explorateur de serveurs

3. Création de la base de données "Education".

Pour créer une nouvelle base de données basée sur le fournisseur de données Microsoft SQL Server, cliquez sur le nœud Connexions de données puis sélectionnez " Créer une nouvelle base de données SQL Server ...»(Fig. 3).

Figure: 3. Appel de la commande pour créer la base données SQL Serveur

En conséquence, la fenêtre " Créer une nouvelle base de données SQL Server"(Fig. 4).

Dans la fenêtre (dans le champ "Nom du serveur"), le nom serveur localinstallé sur votre ordinateur. Dans notre cas, ce nom est «SQLEXPRESS».

Le champ "Nouveau nom de base de données:" contient le nom la base en cours de création Les données. Dans notre cas, c'est le nom Education.

Laissez l'option Utiliser l'authentification Windows inchangée et cliquez sur OK.

Figure: 4. Création nouvelle base Données SQL Server 2008 Express à l'aide de MS Visual Studio 2010

Une fois les actions effectuées, la fenêtre de l'Explorateur de serveurs prendra la forme, comme illustré à la figure 5. Comme vous pouvez le voir sur la figure 5, la base de données Education avec le nom

sasha-pc \\ sqlexpress.Education.dbo

Figure: 5. Fenêtre de l'Explorateur de serveurs après l'ajout de la base de données Education

4. Objets de la base de données Education.

Si vous développez la base de données Education (signe "+"), vous pouvez voir une liste des objets principaux suivants:

  • Diagrammes de base de données - diagrammes de base de données. Les diagrammes montrent les relations entre les tables de base de données, les relations entre les champs de différentes tables, etc.
  • Tables - tables qui stockent les données de la base de données;
  • Vues - vues. La différence entre les vues et les tables réside dans le fait que les tables de base de données contiennent des données, contrairement aux vues de données, et que le contenu est extrait d'autres tables ou vues;
  • Les procédures stockées sont des procédures stockées. Ils représentent un groupe d'opérateurs liés sur langage SQL, qui offre une flexibilité supplémentaire lors de l'utilisation de la base de données.

5. Création de la table Student.

Sur ce moment la base de données Education est complètement vide et ne contient aucun objet (tables, procédures stockées, vues, etc.).

Pour créer une table, appelez le menu contextuel (clic droit) et sélectionnez la commande «Ajouter une nouvelle table» (Figure 6).

Figure: 6. Commande pour ajouter une nouvelle table

Il existe une autre option pour ajouter une table de base de données à l'aide des commandes du menu Données:

Données -\u003e Ajouter nouveau -\u003e Table

Figure: 7. Autre option pour ajouter une nouvelle table

En conséquence, une fenêtre pour ajouter une table s'ouvrira, qui contient trois colonnes (Figure 8). Dans la première colonne «Nom de la colonne», vous devez entrer le nom du champ correspondant de la table de base de données. Dans la deuxième colonne «Type de données», vous devez entrer le type de données de ce champ. La troisième colonne «Autoriser les valeurs nulles» indique l'option sur la possibilité de l'absence de données dans le champ.

Figure: 8. Fenêtre de création d'une nouvelle table

À l'aide de l'éditeur de table, vous devez créer la table Student comme illustré à la figure 9. Le nom de la table doit être défini lors de sa fermeture.

Dans l'éditeur de table, vous pouvez définir les propriétés des champs dans la fenêtre Propriétés de la colonne. Pour définir la longueur d'une chaîne (nvchar) en caractères, la fenêtre Propriétés de la colonne possède une propriété Length. La valeur par défaut de cette propriété est 10.

Figure: 9. Table des élèves

L'étape suivante consiste à définir le champ clé. Cela se fait en appelant la commande «Définir la clé primaire» depuis menu contextuel champs Num_book. En utilisant le champ clé, les relations entre les tables seront établies. Dans notre cas, le champ clé est le numéro du carnet de notes.

Figure: 10. Définition du champ clé

Après avoir défini la clé primaire, la fenêtre de table ressemblera à celle illustrée à la figure 11.

Figure: 11. Table des étudiants après la formation finale

Vous pouvez maintenant fermer la table. Dans la fenêtre de sauvegarde de la table, vous devez définir son nom - Student (Fig. 12).

Figure: 12. Entrez le nom de la table Student

6. Création de la table Session.

Similaire à la création de la table Student, la table Session est créée.

La figure 13 montre la vue de la table Session après la formation finale. La clé primaire est définie dans le champ Num_book. Le nom de la table est donné par Session.

Figure: 13. Tableau des sessions

Une fois les étapes terminées, deux tableaux Étudiant et Session seront affichés dans la fenêtre Explorateur de serveur.

Ainsi, n'importe quel nombre de tables peut être ajouté à la base de données.

7. Modification de la structure des tableaux.

Il y a des moments où vous devez modifier la structure d'une table de base de données.

Pour apporter des modifications aux tables de base de données dans MS Visual Studio, vous devez d'abord décocher la case «Empêcher l'enregistrement des modifications qui nécessitent une recréation de table»Comme le montre la figure 14. Sinon, MS Visual Studio bloquera les modifications apportées à la table créée précédemment. La fenêtre Options illustrée à la figure 14 est appelée à partir du menu Outils dans l'ordre suivant:

Outils -\u003e Options -\u003e Outils de base de données -\u003e Concepteurs de tables et de bases de données

Figure: 14. Option " Empêcher l'enregistrement des modifications nécessitant une recréation de table

Après la configuration, vous pouvez modifier la structure de la table. Pour ce faire, utilisez la commande «Ouvrir la définition de table» (Figure 15) du menu contextuel, qui est appelée pour la table sélectionnée (clic droit).

Figure: 15. Appel de la commande "Open Table Definition"

Cette commande se trouve également dans le menu Données:

Données -\u003e Définition de table ouverte

Tout d'abord, la table doit être sélectionnée.

8. Établir des relations entre les tables.

Conformément à la condition du problème, les tables sont liées les unes aux autres par le champ Num_book.

Pour créer une relation entre les tables, vous devez d'abord (Figure 16):

  • sélectionnez l'objet Diagramme de base de données;
  • sélectionnez la commande Ajouter un nouveau diagramme dans le menu contextuel (ou dans le menu Données).

Figure: 16. Appel de la commande pour ajouter un nouveau diagramme

En conséquence, la fenêtre Ajouter une table pour ajouter un nouveau diagramme s'ouvrira (Figure 17). Dans cette fenêtre, vous devez sélectionner deux tables Session et Student en séquence et cliquer sur le bouton Ajouter.

Figure: 17. Fenêtre pour ajouter des tableaux au diagramme

Figure: 18. Tables Student et Session après les avoir ajoutées au diagramme

Pour commencer à établir une relation entre les tables, vous devez cliquer sur le champ Num_book de la table Student, puis (sans relâcher le bouton de la souris) le faire glisser vers le champ Num_book de la table Session.

En conséquence, deux fenêtres s'ouvriront séquentiellement: Tables et colonnes (Fig. 19) et Relation de clé étrangère (Fig. 20), dans lesquelles vous devez tout laisser tel quel et confirmer votre choix avec OK.

Dans la fenêtre Tables et colonnes, vous spécifiez le nom de la relation (FK_Session_Student) et les noms des tables parent (Student) et enfant.

Figure: 19. Fenêtre Tables et colonnes

Figure: 20. Fenêtre de définition des propriétés des relations

Après les actions effectuées, la relation entre les tables sera établie (Figure 21).

Figure: 21. Relation entre les tables Etudiant et Session

L'enregistrement d'un graphique se fait de la même manière que l'enregistrement d'un tableau. Le nom du diagramme doit être choisi à votre discrétion (par exemple, Diagramme1).

Après avoir spécifié le nom du diagramme, la fenêtre Enregistrer s'ouvre, dans laquelle vous devez confirmer votre choix (Figure 22).

Figure: 22. Confirmation de l'enregistrement des modifications dans les tableaux

9. Saisie de données dans des tableaux.

Microsoft Visual Studio vous permet d'entrer directement des données dans des tables de base de données.

Dans notre cas, lors de l'établissement d'une connexion (Fig. 19), la table Student est sélectionnée comme table de clé primaire. Par conséquent, vous devez d'abord entrer des données dans les cellules de ce tableau particulier. Si vous essayez d'abord de saisir des données dans le tableau Session, le système bloquera cette entrée et affichera le message correspondant.

Pour appeler le mode de saisie des données dans la table Student, vous devez appeler la commande Show Table Data depuis le menu contextuel (clic droit) ou depuis le menu Data (Fig.23).

Figure: 23. Commande Afficher les données de la table

Une fenêtre s'ouvre dans laquelle vous devez saisir les données d'entrée (Fig. 24).

Figure: 24. Saisie de données dans le tableau Student

Après avoir entré les données dans la table Student, vous devez entrer les données dans la table Session.

Lorsque vous saisissez des données dans le champ Num_book de la table Session, vous devez entrer exactement les mêmes valeurs que celles entrées dans le champ Num_book de la table Student (puisque ces champs sont liés).

Par exemple, si le champ Num_book de la table Student contient les valeurs “101”, “102”, “103” (voir Fig. 24), ces valeurs doivent être saisies dans le champ Num_book de la table Session. Si vous essayez d'entrer une valeur différente, le système affichera approximativement la fenêtre suivante (Fig. 25).

Figure: 25. Message d'erreur concernant la saisie des données des tables associées Etudiant et Session

Le tableau Session avec les données saisies est illustré à la Figure 26.

Dans la fenêtre Explorateur de serveurs, où les tables de la base de données sur Microsoft SQL Server sont présentées sous la forme d'une arborescence (voir Fig. 4.1.), Pour chaque table, vous pouvez ouvrir une fenêtre en cliquant sur le bouton Afficher les données de la table. C'est dans cette fenêtre que la possibilité d'éditer les données de table est fournie. Cette fenêtre d'édition ressemble approximativement à celle illustrée à la Fig. 4.2. Environ, parce que le volume complet n'a pas été inclus dans la figure en raison du grand nombre de colonnes.

      1. Implémentation du mappage de base de données

Le mappage de base de données (composant DataSet) est nécessaire pour exclure les appels inutiles à la base de données et au serveur. C'est une fonctionnalité très importante, car si de nombreux utilisateurs travaillent avec la base de données, la charge sur le serveur peut être assez importante - le nombre de requêtes est plusieurs fois plus important, ce qui ralentira l'exécution des requêtes.

Par conséquent, au détriment du DataSet sur l'ordinateur du client, il y a un affichage de la base de données avec laquelle il travaille. À la fin du travail, les bases de données client et serveur sont synchronisées (ou plutôt, les modifications apportées dans la base client sont apportées à la base de données serveur)

Le mappage de notre base de données sur MS Visual Studio 2005 ressemble à ceci:

Toutes les données numériques sont de type Int32, les données de chaîne sont de type String. Les tailles des données de chaîne correspondent à celles données dans le modèle de base de données physique.

La capture d'écran montre qu'il y a également des TableAdapters dans chaque table. Ce sont des sortes de ponts pour connecter DataSet et la source de données. Il a des méthodes comme Fill et GetData ()

Cette méthode est destinée à remplir le tableau avec les données requises de la source (fichier de base de données)

    Méthode GetData ()

Il est destiné à extraire des données de la table de mappage.

    1. Implémentation logicielle

La principale caractéristique de l'implémentation logicielle est le fait que toutes les classes responsables de l'édition des tables de base de données sont héritées d'une classe de base, ce qui facilite la mise en œuvre. Les méthodes de cette classe de base ont été décrites ci-dessus. Les méthodes virtuelles de la classe de base doivent être remplacées dans la classe descendante. Toutes ces méthodes vous permettent de modifier les paramètres de l'enfant tels que: le nom de l'en-tête du formulaire, le remplissage et l'enregistrement de la table de base de données souhaitée (une classe descendante ne fonctionne qu'avec une seule table, dans le sens de l'édition des données; cependant, lors de l'affichage des données à l'utilisateur, il est possible d'utiliser plusieurs tables de la base de données afin d'afficher les données sous une forme compréhensible par l'utilisateur).

      1. Interface du programme

La fenêtre principale est une application MDI qui a le menu suivant:

Chacune des tables d'édition de la base de données est appelée par l'élément de menu correspondant "Tables".

Un rapport sur la charge de travail des enseignants est également généré en cliquant sur l'élément de menu correspondant "Rapports".

En tant que fonctionnalité logicielle supplémentaire, il existe un élément de menu «Console» qui permet d'exécuter des requêtes SQL sur la base de données saisie par l'utilisateur et d'afficher le résultat dans une table (composant DataTable). Pour ce faire, bien sûr, vous devez connaître les noms des tables et des champs, et, fondamentalement, il a été créé pour la commodité de l'implémentation logicielle, mais d'autres utilisateurs "dédiés" peuvent également l'utiliser.

Dans cet article, vous apprendrez ce qu'est LINQ et comment l'utiliser pour interroger des listes.

Qu'est-ce que LINQ? Language Integrated Query (LINQ) - un langage de requête intégré, ou plutôt ambigu projet Microsoft en ajoutant une syntaxe de langage de requête similaire à SQL. Plus précisément, cet outil permet d'interroger relativement facilement des tables et des listes de données, pas nécessairement une base de données.

Les exemples de Microsoft manquent d'un petit mais important détail. Pour travailler avec l'ensemble de données, nous devons utiliser la structure DataContext, dont la définition peut être obtenue à l'aide de SPMetal.exe pour la liste ou la bibliothèque présente sur le serveur Sharepoint. En d'autres termes, nous devons d'abord définir ce type de données, puis créer une requête. En général, je recommande d'utiliser un utilitaire spécial pour travailler dans MVS: Imtech Get SPMetal Definition Extension.

Pour le travail, nous avons besoin d'une sorte de liste. Utilisons une liste simple - une "liste personnalisée"; titre - "Simple appel"; champs par défaut: Numéro, Nom.

Et donc, créons un simple (voir la page correspondante), avec lequel nous observerons le résultat de nos manipulations. Lors de la création d'un projet, nous choisirons un modèle de confiance isolé, s'il est nécessaire de travailler avec des listes ou des données d'autres nœuds, il est alors nécessaire de créer un projet pour la ferme.

Ensuite, créons un fichier de la classe "SimpleCall.cs" en utilisant SPMetal.exe ou un plugin pour le studio. Ajoutons un lien vers la bibliothèque Microsoft.Sharepoint.Linq. Plus d'informations sont disponibles sur le site Web MSDN.

Créons une fonction Render et my_mess. Dans la dernière fonction, nous formerons des données à afficher.

// surcharger la fonction
protected override void Render (écrivain HtmlTextWriter)
{
base .Render (écrivain);
my_mess (écrivain);
}

// Notre fonction pour travailler avec la liste
public void my_mess (écrivain HtmlTextWriter)
{
// Créer un contexte
DataContext data \u003d new DataContext ("http: // localhost");
// Liez-le à la liste correspondante sur le site à la racine
EntityList<Элемент> Simple_Message \u003d data.GetList<Элемент>("Simple appel");
// Exécutez la requête - sélectionnez toutes les lignes dans la liste "Appel simple"
var query \u003d from mess dans Simple_Message
sélectionnez le désordre;
// affiche toutes les données du résultat de la requête
foreach (var elem dans la requête)
{
écrivain.WriteLine ( "Élément de liste:" + elem.Name.ToString ());
écrivain.WriteBreak ();
}

}

Nous compilons le projet et l'ajoutons à la page. En conséquence, toutes les lignes de la liste seront affichées.

Suite plus tard (article non terminé) ...

Annotation: Après avoir lu cette conférence, vous serez en mesure de: créer des requêtes à l'aide du générateur de requêtes SQL Server Management Studio, extraire des informations de base de données à partir des tables système de base de données, créer dynamiquement des requêtes simples basées sur l'entrée utilisateur, formater l'entrée utilisateur et filtrer les requêtes dynamiques complexes, effectuer une analyse et reformater les données pour les utiliser dans le filtre, protéger la base de données contre les attaques par "injection SQL", utiliser la procédure sp_executeSql pour envoyer la requête

Dans la conférence précédente, j'ai parlé de la façon d'augmenter performance demandes. Vous savez maintenant comment créer un ensemble de requêtes efficace pour fournir aux utilisateurs les informations les plus utiles de votre application à l'aide de requêtes prédéfinies dans des procédures stockées ou des vues.

Cependant, dans toutes les applications, sauf les plus simples, il est impossible de connaître à l'avance toutes les options possibles pour les types d'informations dont les utilisateurs pourraient avoir besoin et comment ils voudront les filtrer et les organiser. Au lieu d'essayer de fournir toutes ces possibilités, vous pouvez donner à l'utilisateur le contrôle des informations rapportées par l'application. Cette leçon vous montrera comment créer dynamiquement des requêtes en fonction des choix que l'utilisateur fait pendant l'exécution.

Interface utilisateur pour la création de requêtes

SQL Server Management Studio comprend une interface sophistiquée pour la création de requêtes. Explorons cette interface pour vous donner une idée de la façon dont vous pouvez créer des requêtes de manière dynamique. Votre application n'aura pas besoin de tout les contrôlesfourni par SQL Server Management Studio. Fondamentalement, vous devez réfléchir soigneusement à la meilleure façon de limiter les choix des utilisateurs.

Création d'une requête à l'aide du générateur de requêtes SQL Server Management Studio

Récupération d'informations sur les tables de base de données

Pour fournir à l'utilisateur une liste de paramètres, l'application peut avoir à récupérer des informations sur les tables de la base de données. Il existe plusieurs façons d'obtenir ces informations. La plus importante de ces méthodes est l'utilisation du schéma INFORMATION_SCHEMA. Ce schéma est standard dans n'importe quelle base de données.

Utilisation de INFORMATION_SCHEMA

Le schéma INFORMATION_SCHEMA est un schéma spécial qui se trouve dans chaque base de données. Il contient les définitions de certains objets de la base de données.

INFORMATION_SCHEMA est conforme à la norme ANSI, qui est conçue pour récupérer des informations à partir de n'importe quel moteur de base de données compatible ANSI. Dans SQL Server, INFORMATION_SCHEMA se compose d'un ensemble de vues qui interrogent les tables de base de données sys * contenant des informations sur la structure de la base de données. Ces tables peuvent être interrogées directement, comme n'importe quelle table de base de données. Cependant, dans la plupart des cas, il est préférable d'utiliser les vues de schéma INFORMATION_SCHEMA pour récupérer des informations à partir des tables * sys.

Remarque... Le schéma INFORMATION_SCHEMA interroge parfois les tables inutiles, ce qui nuit aux performances. Dans l'exemple suivant de ce chapitre, ce n'est pas particulièrement important car l'application attendait déjà l'entrée de l'utilisateur. Cependant, cela doit être pris en compte si la vitesse est un aspect important pour votre application.

Voici le code T-SQL de base utilisé pour obtenir des informations sur les colonnes d'une table:

Notez que le champ TABLE_SCHEMA doit être sélectionné pour obtenir le schéma de la table. Cela peut être important pour créer des requêtes similaires à l'avenir. Pour expérimenter les techniques de ce chapitre, créez un nouveau projet dans Visual Studio.

Créer un nouveau projet Visual Studio
  1. Sélectionnez Tous les programmes, Microsoft Visual Studiio 2005, Microsoft Visual Studio 2005 dans le menu Démarrer.
  2. Dans le menu Visual Studio, choisissez Fichier, Nouveau, Projet.
  3. Dans le volet Types de projets, développez le nœud Visual Basic et sélectionnez le modèle d'application dans le volet Modèles. Nommez le projet Chapter7 et cliquez sur OK.
  4. L'application de cet exemple se trouve dans les fichiers d'exemple du dossier \\ Chapter7 \\ DynQuery. Vous pouvez couper et coller le code pour les procédures suivantes à partir du fichier Form1.vb.
Obtenir une liste de tables et de vues

En règle générale, vous devrez fournir à l'utilisateur la possibilité de sélectionner non seulement les colonnes, mais également le tableau pour requête dynamiquevous devez donc afficher une liste de tables à l'utilisateur. Information nécessaire peut être obtenu à l'aide de la requête suivante:

SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE FROM INFORMATION_SCHEMA.TABLES

Dans une application, cette requête peut être utilisée comme suit.

Obtenez une liste de tableaux

Le code Visual Basic ci-dessus initialise un SqlCommand nommé com avec chaîne SQLpour exécuter, puis exécute l'objet SqlCommand. C'est le moyen le plus simple d'exécuter une instruction T-SQL à partir de votre application.

A titre d'exercice, vous pouvez placer les schémas et les tables obtenus en cours d'exécution de la procédure Load de notre formulaire dans interface utilisateur applications sous la forme d'un formulaire afin que l'utilisateur puisse sélectionner le diagramme et la table avec lesquels travailler. Pour l'exemple de ce chapitre, nous supposerons que l'utilisateur a sélectionné le schéma Sales et la table Customer.

Une fois que l'utilisateur a sélectionné une table, il est possible de récupérer la liste des colonnes de cette table en utilisant la même méthode en utilisant l'entrée utilisateur comme nom de table dans la requête. Pour ce faire, entrez un proxy dans la chaîne de requête, puis remplacez ce proxy par un appel à String.Format. Dans le code ci-dessous, l'espace réservé dans la chaîne de requête est (0).

Obtenez la liste des colonnes
  1. Ajoutez la procédure RetrieveColumns suivante au code sous la procédure RetrieveTables:

    Sub RetrieveColumns (ByVal TableName As String) MyConnection As New SqlClient.SqlConnection (_ "Data Source \u003d. \\ SQLExpress;" & _ "Initial Catalog \u003d AdventureWorks; Trusted_Connection \u003d Yes;") Dim sqlStr As String sqlStr \u003d "SELECT TABLE_SCHEMA , COLUMN_NAME, "+ _" ORDINAL_POSITION, DATA_TYPE "+ _" FROM INFORMATION_SCHEMA.COLUMNS "+ _" WHERE (TABLE_NAME \u003d "(0)") "Dim tableColumns As New DataTable Dim da As New SqlClientFatter.SqlData (sqlStr, TableName), MyConnection) da.Fill (tableColumns) For i As Integer \u003d 0 To tableColumns.Rows.Count - 1 With tableColumns.Rows.Item (i) Console.WriteLine ("(0) (1) (2 ) ", _ .Item (1), .Item (2), .Item (3)) End With Next End Sub

  2. Dans la procédure Form1_Load, ajoutez l'appel suivant à la procédure RetrieveColumns après la procédure RetrieveTables:

LA CLOCHE

Il y a ceux qui ont lu cette nouvelle avant vous.
Abonnez-vous pour recevoir les derniers articles.
Email
Nom
Nom de famille
Comment voulez-vous lire The Bell
Pas de spam