2010-08-23 6 views
1

Dans mon code, aucune de ces requêtes ne semble être en cours d'exécution. L'étiquette de débogage imprime comme "fin" donc il exécute quelque chose à l'intérieur de ce bloc de code, juste apparaît qu'il n'aime pas les requêtes?ASP.net pourquoi ces requêtes ne s'exécutent-elles pas?

// Check input is all valid 
if (Page.IsValid) 
{ 
    debug.Text = "begin"; 

    using (SqlConnection cn = new SqlConnection(
     ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString())) 
    { 

     // Verify that username is unique 
     using (SqlCommand cmd = new SqlCommand(
      "UPDATE tblSiteSettings SET isActive = 0", cn)) 
     { 
      cn.Open(); 
      cn.Close(); 
     } 

     using (SqlCommand cmd = new SqlCommand(
      "INSERT INTO tblSiteSettings (allowProductRatings, allowComments, " + 
      "siteName, settingDate, isActive) VALUES (@allowRatings, " + 
      "@allowcomments, @siteName, getDate(), 1)", cn)) 
     { 
      cmd.Parameters.Add("@allowRatings", SqlDbType.Bit).Value = 1; 
      cmd.Parameters.Add("@allowcomments", SqlDbType.Bit).Value = 1; 
      cmd.Parameters.Add("@siteName", SqlDbType.VarChar, 128).Value = "lol"; 
      cn.Open(); 
      cn.Close(); 
     } 
     debug.Text = "end"; 
    } 
} 

Quelques questions:

  1. Pourquoi sont-ils pas exécutaient?
  2. Dans l'ASP classique pour les insertions, les mises à jour et les suppressions, j'utiliserais con.Execute (requête) comme supposé utiliser un jeu d'enregistrements, est-ce que j'exécute ma déclaration de mise à jour correctement ici?
  3. Ma conception des requêtes est-elle bonne ou devrais-je les exécuter différemment?

Répondre

3

La raison pour laquelle cela ne fonctionne pas est que vous n'exécutez pas les requêtes. Ce que vous devez faire est:

// Verify that username is unique 
using (SqlCommand cmd = new SqlCommand("UPDATE tblSiteSettings SET isActive = 0", cn)) 
{ 
    cn.Open(); 
    cmd.ExecuteNonQuery(); 
    cn.Close(); 
} 

using (SqlCommand cmd = new SqlCommand("INSERT INTO tblSiteSettings (allowProductRatings, allowComments, siteName, settingDate, isActive) VALUES (@allowRatings, @allowcomments, @siteName, getDate(), 1)", cn)) 
{ 
    cmd.Parameters.Add("@allowRatings", SqlDbType.Bit).Value = 1; 
    cmd.Parameters.Add("@allowcomments", SqlDbType.Bit).Value = 1; 
    cmd.Parameters.Add("@siteName", SqlDbType.VarChar, 128).Value = "lol"; 
    cn.Open(); 
    cmd.ExecuteNonQuery(); 
    cn.Close(); 
} 

C'est la ligne cmd.ExecuteNoneQuery(); que vous êtes absent. Il existe différents Execute méthodes exposées par la classe SqlCommand, les plus couramment utilisés sont les suivants:

  • ExecuteNonQuery: Exécute une requête et retourne aucun résultat de la requête (elle ne retourne les lignes affectées comme sa valeur de retour cependant)
  • ExecuteScalar: exécute une requête et renvoie la valeur dans la première colonne de la première rangée
  • ExecuteReader: Exécute une requête et renvoie les données à un SqlDataReader
+0

Merci, quelle est la différence entre ExecuteNonQuery et ExecureScalar comme suggéré dans l'autre réponse? –

+0

@Tom - Je viens de développer cela il y a environ 10 secondes pour vous =) avec les liens MSDN pertinents pour enregistrer la réponse à un copier-coller de MSDN, de sorte que vous pouvez obtenir le détail complet ici =) – Rob

+0

ExecuteScalar est utilisé pour renvoyer des valeurs uniques d'un SELECT en tant qu'objet. ExecuteNonQuery renvoie un int pour indiquer les lignes affectées. Tout expliqué dans les liens ... –

2

Votre manquent

cmd.ExecuteScalar(); 

Vous pouvez également réutiliser vous SqlConnection, vous pouvez ouvrir la connexion juste après la déclaration using (SqlConnection cn = new Sql.... Vous ne devez pas fermer la connexion lorsque le SqlConnection est dans un bloc using, en accordant à the documentation la connexion est fermée lorsque vous quittez le bloc using.

+0

ou l'une des autres – leppie

+0

aucune requête ne semble être destinée à renvoyer une valeur, donc ExecuteNonQuery serait le meilleur pari dans cette instance, si rien d'autre pour rendre l'intention du code plus clair à quiconque doit revoir ou modifier le code à l'avenir =) – Rob

+0

+ Je vous remercie pour votre réponse, je me rends compte que je n'ai pas besoin d'ouvrir la connexion pour chaque requête maintenant, est-il également préférable de fermer la connexion même si la collecte des ordures prendra soin de lui? Je préfère toujours avoir l'assurance que je le fais moi-même et ne pas compter sur les ordures. –

Questions connexes