6
votes

Insertion de données plusieurs fois dans une table SQL, à partir d'un seul bouton sur les formulaires Windows

Je insère des données d'un Formulaire Windows dans une base de données SQL comme ci-dessous:

private void button1_Click(object sender, EventArgs e)
{
    **c.Open();**

    string w = "insert into checkmultiuser(username) values (@username)";

    SqlCommand cmd = new SqlCommand(w, c);

    cmd.Parameters.Add("@username", SqlDbType.VarChar);
    cmd.Parameters["@username"].Value = textBox1.Text;
    //cmd.ExecuteNonQuery();
    cmd.ExecuteReader();
    **c.Close();**
}


1 commentaires

Dans le code mis à jour, veuillez supprimer la ligne CMD.EXecuTreader () entièrement et déplacez la ligne cmd.executenonquery ().


4 Réponses :


11
votes

8 commentaires

De plus, il devrait fermer le SQLCOMMAND en le mettant dans en utilisant .


Mis à jour avec quelques exemples de code, dont l'un montre l'utilisation de l'utilisation.


@Jason Down: Merci beaucoup monsieur pour votre grande réponse, le lecteur tente également d'ouvrir la connexion à chaque fois qu'il doit récupérer une rangée d'une table?


@Jason Down: Je suis juste en utilisant cmd.executereader (), mais aucune création de lecteur, cette méthode crée-t-elle automatiquement un lecteur?


@sqlChild - Pour votre première question: L'appel ExecuterAreader ouvre la connexion et le garde ouverte. Chaque lecture ensuite ne nécessite pas que la connexion soit rouverte. Pour votre deuxième question: dès que vous appelez ExecuTereader, il créera un objet de lecture, même si vous ne l'utilisez pas en l'attribuant à une variable. Je ne sais pas quand cet objet sera marqué pour la collecte des ordures. Si vous n'utilisez pas cela, il serait préférable de ne pas le créer du tout. Vous êtes toujours mieux en train de changer votre exécuteur exécuté à exécutenonquery pour une commande insertion. Je ne peux pas penser à un bon argument contre elle.


@sqlChild - Il n'y a pas d'inconvénient réel dans l'ouverture et la fermeture de la connexion. La mise en commun de la connexion rendra les choses un peu plus efficaces pour vous. Cependant, je vous recommanderais de configurer l'objet de commande en dehors du bouton, cliquez sur. La commande insert ne change jamais, à l'exception de la valeur que vous attribuez au paramètre. Vous créez un nouvel objet à chaque fois, ce qui n'est pas nécessaire. Et je recommanderais toujours exécutenonquery sur ExecuTereader. Le but de l'exécutenonquery est d'apporter des modifications aux données. ExecuTereader est conçu pour remettre des lignes de données une à la fois.


Si, l'exécutereader () ne réexente pas de connexion, alors pourquoi donne-t-il l'erreur lorsque j'appuie à nouveau sur le bouton: Il y a déjà un digne de données ouverte associé, s'il vous plaît dites-moi la signification de cette erreur


Mon café n'a pas encore botté. Un objet DigneAreader doit également être fermé. Je suppose que depuis que vous n'utilisez pas cela, il n'est pas fermé dans le temps et jetant l'erreur. Si vous insistez sur l'utilisation de la méthode exécutereader, attribuez-la à une valeur dans un bloc d'utilisation. en utilisant (var RDR = cmd.executereader ()) {}; Vous pouvez voir à quel point cela est idiot, car vous créez un lecteur, puis ne l'utilisez pas. Cela devrait résoudre votre problème cependant.



1
votes

Tout d'abord, vous devez utiliser exécutenonquery code> pour gérer les inserts, les mises à jour et la suppression. ExecutenonQuery est utilisé lorsque vous ne vous attendez pas à une valeur de la base de données.

Mais si vous souhaitez utiliser un digne d'information dans une autre situation, vous devez l'utiliser comme indiqué ci-dessous. P>

using (SqlDataReader reader= cmd.ExecuteReader())
{
        while (reader.Read())
        {
            //Do the reading
        }
 }


0 commentaires

0
votes

Vous pouvez essayer:

cmd.ExecuteReader(CommandBehavior.CloseConnection);


0 commentaires

2
votes

Qu'est-ce que Jason a dit.

Alors que vous y êtes là, il peut être peut-être peut-être peut-être modifier votre code légèrement sur: xxx

pour que les objets soient correctement éliminés. bloquer le bloc aussi, puis fermez votre connexion dans le enfin {c.frose ();}


2 commentaires

@sqlchild Dans ce cas, j'aurais modifié mon code pour être très similaire à celui de Jason, qui est maintenant marqué comme la réponse - un uppote pour lui de moi. Je suis heureux que tu l'aie résolu :)


Monsieur, si j'utilise une commande SELECT ici, puis-je utiliser un jeu de données car il est un environnement déconnecté ou afficher des données à l'utilisateur lorsqu'il clique sur le bouton directement dans la base de données? Ce qui serait plus rapide et meilleur?