2010-08-23 62 views
1

在我的代码中,这些查询似乎都没有运行。调试标签打印为“结束”,所以它正在执行该代码块内的东西,只是显示它不喜欢查询?ASP.net为什么这些查询不能执行?

// 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"; 
    } 
} 

几个问题:

  1. 他们为什么不执行?
  2. 在经典的ASP插入,更新和删除我会使用con.Execute(查询)应该使用记录集,我在这里正确运行我的更新语句?
  3. 是我的设计的查询好,还是应该以不同的方式执行它们?

回答

3

它没有做任何事情的原因是因为你没有真正执行查询。你需要做的是:

// 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(); 
} 

这是行cmd.ExecuteNoneQuery();,你错过了。存在由SqlCommand类暴露的各种不同的Execute方法,最常用的有:

  • ExecuteNonQuery:执行查询和查询不返回任何结果(它返回受到影响,但它的返回值的行)
  • ExecuteScalar:执行查询并返回第一行
  • ExecuteReader的第一列中的值:执行查询和数据返回到一个SqlDataReader
+0

谢谢,ExecuteNonQuery和ExecureScalar之间的区别是什么,在另一个答案建议? – 2010-08-23 08:52:30

+0

@Tom - 我刚刚在10秒左右的时间里对你进行了扩展=)以及相关的MSDN链接,以便将答案保存为MSDN的副本和粘贴,以便您可以在其中获得完整的详细信息=) – Rob 2010-08-23 08:53:31

+0

ExecuteScalar用于从SELECT中返回单个值作为对象。 ExecuteNonQuery返回一个int值来表示受影响的行。所有解释的链接... – 2010-08-23 08:55:03

2

你缺少

cmd.ExecuteScalar(); 

您也可以重用你SqlConnection,你可以打开using (SqlConnection cn = new Sql...声明之后的连接。当SqlConnection位于正在使用的块中时,您不必关闭连接,根据the documentation,当您离开using块时连接关闭。

+0

或者其他的一个 – leppie 2010-08-23 08:51:45

+0

这两个查询似乎都不会返回一个值,因此如果没有其他任何事情使代码的意图更清晰,那么任何必须在将来查看或更改代码的人都可以使用ExecuteNonQuery =) – Rob 2010-08-23 08:54:52

+0

+ 1感谢您的回答,我意识到现在我不需要为每个查询打开连接,即使垃圾回收会照顾它,关闭连接也是更好的做法吗?我总是喜欢有自信的保证,而不是依靠垃圾。 – 2010-08-23 08:56:41