2010-08-23 2 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 (query), как предполагается, для использования набора записей, могу ли я правильно запустить инструкцию по обновлению здесь?
  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();, что вы пропали без вести. Существуют различные Execute Методы, открытые в SqlCommand класса, наиболее часто используемыми являются:

  • ExecuteNonQuery: Выполняет запрос и не возвращает никакого результата из запроса (он делает возвращение строк, затронутых в качестве возвращаемого значения однако)
  • ExecuteScalar: Выполняет запрос и возвращает значение в первом столбце первой строки
  • ExecuteReader: Выполняет запрос и возвращает данные в SqlDataReader
+0

Спасибо, в чем разница между ExecuteNonQuery и ExecureScalar, как предложено в другом ответе? –

+0

@Tom - я только что расширил это примерно за 10 секунд назад для вас =) вместе с соответствующими ссылками MSDN, чтобы сохранить ответ на копирование и вставку MSDN, чтобы вы могли получить полную информацию там =) – Rob

+0

ExecuteScalar is используется для возврата отдельных значений из SELECT в качестве объекта. ExecuteNonQuery возвращает int для обозначения строк Affected. Все объяснено в ссылках ... –

2

Ваш отсутствуют

cmd.ExecuteScalar(); 

Вы также можете повторно вы SqlConnection, вы можете открыть соединение сразу же после using (SqlConnection cn = new Sql... заявления. Вам не нужно закрывать соединение, когда SqlConnection находится в используемом блоке, при условии, что соединение the documentation закрывается, когда вы покидаете блок using.

+0

или один из других – leppie

+0

ни один запрос не предназначен для возврата значения, поэтому ExecuteNonQuery будет лучшей ставкой в ​​этом случае, если больше ничего не сделать целью четкого кода для всех, кто должен будет пересмотреть или изменить код в будущем =) – Rob

+0

+ 1 спасибо за ваш ответ, я понимаю, что мне не нужно открывать соединение для каждого запроса сейчас, также лучше ли закрывать соединение, даже если сборка мусора позаботится об этом? Я всегда предпочитаю иметь уверенность, что я делаю это сам и не полагаюсь на мусор. –

Смежные вопросы