0 votes

Obtention d'une sqlexception lors d'une insertion réussie, VB.NET

J'essaie d'effectuer un INSERT très simple en utilisant VB.NET. Pour une raison quelconque, j'obtiens une SqlException à chaque insertion. Les données sont insérées, mais je reçois toujours le message suivant :

Violation de la contrainte PRIMARY KEY 'PK_User'. Impossible d'insérer une clé dupliquée dans l'objet 'dbo.Employee'. L'instruction a été interrompue

Lorsque je vérifie dans SQL Management Studio, les données sont insérées avec succès.

Voici le code où le problème se produit

Try
    conn.Open()
    Dim insertSQL As String = "insert into Employee(uName, firstName, lastName,
        On_Switch, On_Phone) " + "values('" & uName & "', '" & firstName & "', '" _
        & lastName & "', '" & onSwitch & "', '" & onPhone & "')"
        Dim AddCom As SqlCommand = New SqlCommand(insertSQL, conn)

        If (AddCom.ExecuteNonQuery() = 1) Then

            lblError.Text = "User Added."
            ' string urlBack = "../ViewAsset.aspx?DeptID=" + DeptID;
            ' Response.Redirect(urlBack);
        End If

        conn.Close()

    Catch ex As SqlException
        Dim ExMsg As String = ex.Message.ToString()
        lblError.Text = ExMsg

J'ai repris et testé le même code en C# et aucune exception n'a été levée. Il semble qu'il s'agisse d'un petit problème que je fais en VB, mais je ne sais pas ce que c'est.

7voto

Mitchel Sellers Points 38352

À titre d'information, je recommande FORTEMENT de passer aux requêtes paramétrées pour prévenir le risque d'injection SQL contre lequel votre code actuel n'est pas protégé.

Pour le problème d'erreur, je vérifierais que votre code n'est pas appelé deux fois dans la version VB.

3voto

Joseph Anderson Points 1792

Deux théories. Soit votre code est exécuté deux fois, soit il y a un déclencheur sur la table Employee qui tente une insertion après l'insertion réussie. (Edit : @Mitchel Sellers a exactement raison, si le même code fonctionne en c#, ce n'est absolument pas un problème de déclencheur).

Mon intuition est que votre code est exécuté deux fois. Essayez de l'exécuter avec le débogueur connecté et un point d'arrêt défini sur l'ExecuteNonQuery - je pense que vous découvrirez qu'une autre méthode appelle cette méthode plusieurs fois.

@Mitchel Sellers - Bien vu pour le bug de l'injection SQL ! Paramètres, s'il vous plaît !

0voto

BenR Points 5199

Par ailleurs, j'ai remarqué que votre code pouvait potentiellement laisser une connexion sql ouverte. Si vous utilisez le cadre .NET 2.0, vous devez utiliser l'instruction Using. Elle garantit que les connexions sont fermées et éliminées même si une exception est levée. Consultez cet article sur MSDN pour plus de détails : http://msdn.microsoft.com/en-us/library/htd05whh.aspx . L'autre option serait d'ajouter l'instruction close dans un dernier bloc de votre gestionnaire try-catch.

0voto

Si vous exécutez ce code dans le cadre d'un événement quelconque, assurez-vous que vous n'avez pas souscrit plusieurs fois à cet événement. J'ai eu ce problème en asp.net. En général, je supprime simplement le gestionnaire d'événement de clic dans le code derrière et l'attribut onclick dans le fichier aspx s'il existe également, puis je réessaie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X