IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Connexion et déconnexion


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2017
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2017
    Messages : 63
    Points : 28
    Points
    28
    Par défaut Connexion et déconnexion
    Bonjour,

    j'ai crée une BDD Pointat (id, nom,début,fin,commentaire), l'id doit être automatique. connexion (id,nom,début) déconnexion (même id de connexion,fin) toutes les informations sont sur le même ligne (id, nom,début,fin,commentaire).


    Pourriez vous m'aider?

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Qu'avez-vous essayé jusqu'ici ? Où êtes-vous bloqué ?

    @++

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2017
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2017
    Messages : 63
    Points : 28
    Points
    28
    Par défaut
    Bonjour,

    J'ai fait :

    • un insert into Pointatage (id, nom,début,fin) values('"+ txt_Id.text+"','"+ txt_nom.text+"',getdat()) pour la connexion
    • update Pointatage set id = '"+ txt_Id.text+"', fin=getdat() where id = '"+ txt_Id.text+"' pour la déconnexion.


    Par contre, l'automatisation de id n'est pas prise en compte. J'ai créé une procédure pour l'automatisation de l'id, mais ça bloque lors de la dixième insertion.

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Il aurait été utile de respecter la charte de postage, et donc de donner le code de création de vos tables, celui de la procédure (VB ou SQL ?), et l'erreur que vous obtenez lorsque vous faites les dixième insertion ... et n'oubliez pas des lettres dans vos mots, même si vous êtes vraiment très préssé

    Par ailleurs l'énoncé initial de votre situation n'est pas clair : vous semblez confondre une base de données et des tables. Une base de données est un ensemble de tables (et encore j'ai vu des cas biscornus où ce n'était pas le cas), de contraintes, de vues, d'index, de déclencheurs, de procédures stockées, de fonctions, de types définis par l'utilisateur et bien d'autres types d'objets encore avec lesquels on peut faire des choses fantastiques . La colonne nom est-elle celle d'un employé, d'un utilisateur de l'application, ... ? Exposez votre contexte, et vous verrez qu'on peut vous aider bien au-delà de ce que espériez

    Revenons-en à votre problème, et commençons par voir ce que l'on peut faire pour la table des pointages :

    • On peut faire générer un identifiant au moteur en adjoignant à la colonne supportant la clé primaire la propriété IDENTITY
    • On peut définir une contrainte de valorisation par défaut pour la colonne debut, ce qui évite d'avoir à le spécifier dans l'INSERT. Délégons ce travail au serveur !
    • Lorsque la valeur de fin n'est pas à NULL, il faut vérifier qu'elle est supérieure (ou égale ?) à la date de début
    • Enfin, il ne peut y avoir qu'un seul pointage par employé pour un horaire donné, ce que l'on peut imposer à l'aide d'une contrainte supplémentaire


    Ceci donne la table suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE pointage
    (
    	id int NOT NULL IDENTITY
    		CONSTRAINT PK_Pointage PRIMARY KEY
    	, nom varchar(50) NOT NULL
    	, debut datetime2(3) NOT NULL
    		CONSTRAINT DF_Pointage__debut DEFAULT (SYSDATETIME())
    	, fin datetime2(3)
    	, commentaire varchar(1024)
    	, CONSTRAINT CHK_Pointage__debut__fin CHECK (fin IS NULL OR fin >= debut)
    	, CONSTRAINT UQ_Pointage__debut__fin__nom UNIQUE (debut, fin, nom)
    )
    Le type de données datetime2(3) permet de stocker une date et une heure avec une précision à la milliseconde. Si vous n'avez besoin d'une précision qu'à la seconde, remplacez le 3 par un zéro.
    Les contraintes d'unicité sont nécéssairement supportées par un index, ce qui permet d'accélérer les recherches. Comme il est probable que la plupart des recherches dans cette table se fassent sur la base d'une date, il est donc doublement utile d'avoir cette contrainte en place.

    Enfin, il faut vérifier qu'on n'a qu'un seul pointage ouvert par personne, et comme il faut compter combien il y a de connexion ouvertes, on doit d'abord créer la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    CREATE FUNCTION dbo.f_s_chk_pointage_ouvert
    	(
    		@_nom varchar(50)
    	)
    RETURNS bit
    WITH SCHEMABINDING
    AS
    BEGIN
    	DECLARE @ok bit = 1
     
    	SELECT	@ok = CASE WHEN COUNT(*) > 1 THEN 0 ELSE 1 END
    	FROM	dbo.pointage
    	WHERE	nom = @_nom
    	AND	fin IS NULL
     
    	RETURN @ok
    END
    GO
    Ce qui nous permet de créer la contrainte suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ALTER TABLE dbo.pointage
    ADD CONSTRAINT CHK_pointage__nom__debut__fin CHECK(dbo.f_s_chk_pointage_ouvert(nom) = 1)
    GO
    Lors de la connexion, il suffit de soumettre la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    INSERT INTO dbo.pointage
    (
    	nom
    	, commentaire
    )
    VALUES
    (
    	'ElSuket'
    	, 'Séquence de boot cerveau en cours ...'
    )
    Si l'on exécute un SELECT * FROM dbo.pointage, on obtient alors :

    Nom : 01.PNG
Affichages : 327
Taille : 4,3 Ko

    On a laissé au moteur de base de données le soin de générer les valeurs, et il l'a fait proprement, comme un grand
    Si on ré-exécute ce même INSERT, on obtient l'erreur suivante, ce qui est le comportement recherché :

    Nom : 02.PNG
Affichages : 230
Taille : 6,5 Ko

    Soumettons maintenant l'INSERT suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    INSERT INTO dbo.pointage
    (
    	nom
    	, commentaire
    )
    VALUES
    (
    	'Dachetache'
    	, 'Début de journée pour l''application des pointages !'
    )
    Puis exécutons une nouvelle fois un SELECT * FROM dbo.pointage, pour voir ce que la table contient :

    Nom : 03.PNG
Affichages : 295
Taille : 6,5 Ko

    On a bien deux lignes, et la deuxième porte l'id 3 ... Comment cela se fait-il ? Lors de la 2e exécution de l'INSERT qui a levé une exception du fait de la contrainte CHK_pointage__nom__debut__fin, la valeur de l'id a bien été générée, mais comme la transaction a échoué, celle-ci a été annulée. Et comme les valeurs pour l'auto-incrément sont dans un cache, nous sommes donc à la valeur 3 pour le dernier INSERT. On s'en moque puisque cette colonne n'a pas de valeur sémantique : elle est purement technique, et permet, entre autres, de supporter les jointures de façon très performante. On peut récupérer la valeur d'id qui a été générée en utilisant la fonction SCOPE_IDENTITY().

    Voyons une déconnexion maintenant : je me déconnecte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE	dbo.pointage
    SET	fin = SYSDATETIME()
    WHERE	id = 1
    Une nouvelle exécution de SELECT * FROM dbo.pointage nous donne :

    Nom : 04.PNG
Affichages : 339
Taille : 10,5 Ko

    Vous faites une erreur importante en soumettant les valeurs en "dur" dans votre requête. En effet, SQL Server dispose d'une cache de requêtes, ce qui permet de consommer un minimum de CPU. Pour ce faire, il se base sur le texte de la requête. Un changement, fût-il mineur (un espace, un point virgule de fin de requête, ...) du texte de la requête entraîne donc la création d'une nouvelle entrée dans ce cache de requêtes, et la consommation de temps CPU. Comme le texte de votre requête va changer à peu près à chaque exécution, on va donc créer un grand nombre d'entrées dans ce cache, qui le rendra donc sous-efficace, alors que la requête ne change que par ses valeurs. Voyez à utiliser une procédure stockée, ou à défaut, spécifier des appels à sp_executesql, ou, à défaut, à activer l'option d'instance optimize for ad hoc workloads, qui gère ce type de problème pour vous.

    La procédure de connexion pourrait être, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    CREATE PROCEDURE p_pointage_ajoute
    	@_nom varchar(50)
    	, @_commentaire varchar(1024) = NULL
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	INSERT	INTO dbo.pointage
    	(
    		nom
    		, commentaire
    	)
    	VALUES
    	(
    		@_nom
    		, @_commentaire
    	);
    END
    Et à l'exécution, on aurait, si l'on ne souhaite pas ajouter de commentaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXEC dbo.p_pointage_ajoute @_nom = 'ElSuket'
    Et si on veut attacher un commentaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXEC dbo.p_pointage_ajoute @_nom = 'ElSuket', @_commentaire = 'Un appel de procédure stockée'
    Avec sp_executesql, on aurait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    EXEC sp_executesql N'
    	INSERT	INTO dbo.pointage
    	(
    		nom
    		, commentaire
    	)
    	VALUES
    	(
    		@_nom
    		, @_commentaire
    	);'
    	----
    	, N'@_nom varchar(50), @_commentaire varchar(1024)'
    	, @_nom = 'Dachetache'
    	, @_commentaire = 'Connexion !'
    Je vous laisse deviner ce que cela pourrait être pour les déconnexions

    @++

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2017
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2017
    Messages : 63
    Points : 28
    Points
    28
    Par défaut
    Bonjour

    je vous remercie pour votre aide une autre question concerne l'utilisation de la procédure voila ce que j'ai fait.
    Dans mon programme c#, j'ai fait un void.

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void Ajouter()
    {
                Connexion con = new Connexion(); // la classe connexion avec la base de données
                SqlDataAdapter sda = new SqlDataAdapter("p_pointage_ajoute", con.ActifCon());
                sda.SelectCommand.CommandType = CommandType.StoredProcedure;
    }
     
    private void btn_Ajouter_Click(object sender, EventArgs e)
            {
                Ajouter();
            }

    Erreur sql server:
    Msg 201, Niveau 16, État 4, Procédure Proc_DeleteSERRE, Ligne 12
    La procédure ou fonction 'Proc_DeleteSERRE' attend le paramètre '@_nom', '@_commentaire', qui n'a pas été fourni.

    Ou est-ce que je peux exécuter en mettant les paramètres (EXEC dbo.p_pointage_ajoute @_nom = 'ElSuket', @_commentaire = 'Un appel de procédure stockée')?

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2017
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2017
    Messages : 63
    Points : 28
    Points
    28
    Par défaut
    Bonjour,
    j'ai rencontré un problème pour la connexion avec mes interface. J'ai créé une classe connxion qui me permet de recuperer facilement les information de la conxion.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    class Connexion
        {
            public SqlConnection con;
            public SqlCommand cmd;
            public SqlDataAdapter sda;
            public string pkk;
            public void connexion()
            {
                con = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=Entreprise;Integrated Security=True");
                con.Open();
            }
            public void dataSend(string SQL)
            {
                try
                {
                    connexion();
                    cmd = new SqlCommand(SQL, con);
                    cmd.ExecuteNonQuery();
                    pkk = "";
                }
                catch (Exception)
                {
                    pkk = "Verifiez vos données";
                }
                con.Close();
            }
            public void dataGet(string SQL)
            {
                try
                {
                    connexion();
                    sda = new SqlDataAdapter(SQL, con);
                }
                catch
                {
     
                }
                //con.Close();
            }
    la methode pour supprimer les information
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    void SupprimerFichier()
            {
                DialogResult mod = MessageBox.Show("Etes vous sur de supprimer", "Supprimer", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (mod == DialogResult.Yes)
                {
                    Connexion con = new Connexion();
                    con.dataSend(@"DELETE FROM [Doc_Salarié] Where [Matricule] = '" + tB_Matricule.Text + "'");
                    // convertimage();
                    con.cmd.ExecuteNonQuery();
                }
                else
                {
                    MessageBox.Show("Le fichier n'est pas supprimé", "Pas de suppression", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
    Quand j’exécute mon programme en insert,update et delete(supprission), il y a une erreur qui apparaît au niveau "con.cmd.ExecuteNonQuery();".
    voila le message d'erreur qui s'affiche "Informations supplémentaires : ExecuteNonQuery nécessite une Connection ouverte et disponible. La connexion est actuellement fermée."
    Pour moi l'erreur viens de ma classe connexion car j'ai mis un con.Close dans mon dataSend. Lorsque je mets le con.Close dans mon dataGet les informations inserées sont doubléés.
    Pourriez vous regarder mon code?

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2017
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2017
    Messages : 63
    Points : 28
    Points
    28
    Par défaut
    je viens de trouver l'erreur. C'est que j'ai mis "con.cmd.ExecuteNonQuery();" dans la classe connexion et je l'ai ajouté aussi dans la méthode supprimer.

Discussions similaires

  1. [WD14] Connexion et déconnexion
    Par Raptor92 dans le forum WinDev
    Réponses: 24
    Dernier message: 18/06/2010, 19h32
  2. Fréquence des connexion et déconnexion vos avis
    Par berceker united dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/07/2008, 09h29
  3. Optimisation de la connexion et déconnexion à une BD
    Par scilab dans le forum Struts 1
    Réponses: 1
    Dernier message: 24/09/2007, 10h03
  4. MySQL -> pb de connexion et déconnexion
    Par gailup dans le forum Installation
    Réponses: 10
    Dernier message: 24/05/2006, 17h35
  5. Pb de connexion et déconnexion
    Par genki dans le forum MFC
    Réponses: 9
    Dernier message: 30/09/2004, 18h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo