2010-07-22 4 views
1

J'utilise adapter.InsertCommand pour insérer des données dans une table.La requête d'insertion SQL est exécutée deux fois

Le seul problème est qu'il est exécuté deux fois, me donnant ainsi des entrées doubles dans le DB. J'ai essayé de suivre l'exemple dans la documentation de adapter.InsertCommand et mon propre code, mais obtenir le même résultat.

Voici mon code:

public class nokernokDAL 
{ 
    SqlConnection connection = new SqlConnection(); 
    SqlDataAdapter adapter = new SqlDataAdapter(); 

    public nokernokDAL() 
    { 
     connection.ConnectionString = EPiServer.Global.EPConfig["EPsConnection"].ToString(); 
     connection.Open(); 
    } 

    public void addNewComment(int userID, int pageID, string title, string comment) 
    { 
     string query = "INSERT INTO dbo.nokernok_kommentarer (userID, pageID, commentTitle, comment) " + 
         "VALUES ("+ userID +", "+ pageID +", '"+ title +"', '"+ comment +"')"; 

     adapter.InsertCommand = new SqlCommand(query, connection); 
     adapter.InsertCommand.ExecuteNonQuery(); 

    } 
} 

suggestions Anny dans la façon dont je peux éviter cela?

MISE À JOUR

droit, après un certain débogage, j'ai découvert que ma fonction newWallComplaint_Click a été tiré à deux reprises. C'était parce que j'avais le code suivant:

protected void Page_Load(object sender, EventArgs e) 
    { 
      btnNewWallComplaint.Click += new EventHandler(this.newWallComplaint_Click); 
    } 

Ne vérifiant pas PostBack, ceci exécute ma fonction après soumettre aussi. Donc, pour éviter que ma fonction ne fonctionne deux fois, j'ai ajouté une vérification pour PostBack.

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      btnNewWallComplaint.Click += new EventHandler(this.newWallComplaint_Click); 
     } 

    } 

Maintenant, ma requête n'est pas exécutée deux fois.

+4

faire du débogage et déterminer si la fonction est exécutée deux fois d'une façon ou si elle exécute en fait le SQL deux fois . –

+0

Je suppose que votre titre dit tout - « requête d'insertion SQL est en effet exécuté deux fois »! –

+0

J'ai vu des utilisateurs "double cliquer" sur un bouton (les boutons n'ont besoin que d'un simple clic), ce qui fait que le code sous-jacent est exécuté deux fois, êtes-vous sûr que quelque chose comme ça ne se passe pas ici? –

Répondre

2

Je ne vois rien dans votre code qui l'exécuterait deux fois. Je suppose qu'il est appelé deux fois. Mettez un point d'arrêt à addNewComment et, s'il est appelé deux fois, examinez les traces de la pile pour voir d'où elles sont appelées à chaque fois.

Peut-être que vous avez un événement appelé deux fois par exemple. Cela peut se produire dans ASP.NET si vous avez activé le câblage automatique des événements et si vous avez câblé l'événement explicitement.

par la façon dont vous devez absolument utiliser parametrized queries pas concaténation de chaînes. Je suppose que ce commentaire est une entrée fournie par l'utilisateur? Dans ce cas, vous vous préparez pour une attaque par injection SQL avec le code que vous avez montré.

+1

Merci. Le débogage ne fonctionne pas, mais je suis bon pour sortir des chaînes. Il s'est avéré que je n'utilisais pas if (! IsPostBack) au chargement de la page, exécutant ainsi mon script deux fois. Voir le code mis à jour. – Steven

0

Avez-vous vraiment besoin d'un DataAdapter pour cela? Peut-être que vous pouvez essayer cela.

public class nokernokDAL 
{ 
    string connectionString; 

    public nokernokDAL() 
    { 
     ConnectionString = EPiServer.Global.EPConfig["EPsConnection"].ToString(); 
    } 

    public void addNewComment(int userID, int pageID, string title, string comment) 
    { 
     string query = "INSERT INTO dbo.nokernok_kommentarer (userID, pageID, commentTitle, comment) " + 
         "VALUES ("+ userID +", "+ pageID +", '"+ title +"', '"+ comment +"')"; 

     using (SqlConnection conn = new SqlConnection(_connString)) 
     { 
      SqlCommand cmd = conn.CreateCommand(); 
      cmd.CommandText = Query; 
      conn.Open(); 
      cmd.ExecuteNonQuery(); 
     } 
    } 
} 
1

Je trouve que j'avais à la fois un datatable et un ensemble de données, mais seulement nécessaire datatable ...

parce que je les avais à la fois courir à côté eachother dans la même commande, un double a été créé ...

assurez-vous d'utiliser tout dans la commande et vous comprenez ce que chacun fait, même si votre place éveillé pendant 2 jours comme je ...

  DataSet dataset = new DataSet(); 

      data.Fill(dataset, "data"); 

      // Populate a new data table and bind it to the BindingSource. 
      DataTable datatable = new DataTable(); 
      data.Fill(datatable); 

comme vous pouvez le voir J'ai eu deux sources remplir un MySqlDataAdapter ...

  //removing the following two lines fixed my duplicates issue... 
      //DataSet dataset = new DataSet(); 
      //data.Fill(dataset, "data"); 

      // Populate a new data table and bind it to the BindingSource. 
      DataTable datatable = new DataTable(); 
      data.Fill(datatable); 

espère que cela aide quelqu'un ...

Questions connexes