2013-06-01 3 views
1

Я занимаюсь этим часами и не могу найти проблему здесь. У меня есть 3 страницы, 2 из которых имеют обновления и работают нормально, но это не то, что я надеюсь, что кто-то сможет найти, где проблема.Обновление не работает C# ADO.net

Все, что «появляется» для работы, я вижу «успешно обновленное» сообщение, но оно просто не обновляет данные.

Вот соответствующие фрагменты кода:

ASCX:

<asp:Repeater ID="TestDataList" runat="server" onItemCommand="Item_Command"> 
     <ItemTemplate> 
      <div class='<%# Container.ItemIndex % 2 == 0 ? "list-wrap" : "list-wrap alternate" %>'> 
       <a href="#" class="edit-list icon-pencil icon-large"></a> 
       <div class="update"> 
        <span class="dl-content"> 
         <h2><asp:Label ID="TestNameDisplay" runat="server" CssClass="name" Text='<%# Eval("TestName") %>'/></h2> 
        </span> 
        <asp:LinkButton ID="deleteTestCase" CssClass="delete-list icon-trash icon-large" runat="server" CommandName="deleteTestCase" CommandArgument='<%#Eval("TestCaseID")%>'/> 

        <%--edit form--%> 
        <span class="dl-update">  
         <asp:TextBox ID="TxtUpdateTestName" runat="server" CssClass='textEntry' Text='<%#Eval("TestName")%>'></asp:TextBox> 
         <asp:LinkButton ID="EditTestNameButton" runat="server" Text="Save" CommandName="SelectTestName" CommandArgument='<%#Eval("TestCaseID")%>' ValidationGroup='<%# "UpdateTestCaseName" + Eval("TestCaseID") %>' /> 
         <asp:RequiredFieldValidator ID="UpdateTestNameRequired" runat="server" ControlToValidate="TxtUpdateTestName" CssClass="formValidation" ErrorMessage="What good is a test case with no name?" ValidationGroup='<%# "UpdateTestCaseName" + Eval("TestCaseID") %>'/> 
        </span> 
       </div> 
</ItemTemplate> 
    </asp:Repeater> 

Код Behind:

protected void Item_Command(Object sender, RepeaterCommandEventArgs e) 
    { 
     if (e.CommandName == "SelectTestName") 
     { 
      string setTestNameSQL = "UPDATE TestCases SET TestName = @TestName WHERE TestCaseID = " + e.CommandArgument; 

      SqlConnection conn = new SqlConnection(GetConnectionString()); 
      SqlCommand cmdUpdateTestName = new SqlCommand(setTestNameSQL, conn); 

      TextBox tb = (TextBox)e.Item.FindControl("TxtUpdateTestName"); 

      SqlParameter u1 = new SqlParameter("TestName", tb.Text); 
      SqlParameter u2 = new SqlParameter("TestCaseID", e.CommandArgument); 

      cmdUpdateTestName.Parameters.Add(u1); 
      cmdUpdateTestName.Parameters.Add(u2); 

      try 
      { 
       conn.Open(); 
       cmdUpdateTestName.ExecuteNonQuery(); 
       PopulateTestList(); 
       lblUserFeedbackMessage.Text = "Sucessfully updated!"; 
      } 
      catch (System.Data.SqlClient.SqlException ex) 
      { 
       string msg = "Update Error:"; 
       msg += ex.Message; 
       throw new Exception(msg); 
      } 
      finally 
      { 
       conn.Close(); 
      } 
     } 
+0

Привет, приятель !!! Не волнуйся. Вы просто пропустили символ @ в имени объекта sqlparameter –

ответ

1

Попробуй так:

string setTestNameSQL = "UPDATE TestCases SET TestName = @TestName WHERE TestCaseID = @TestCaseID"; 

SqlConnection conn = new SqlConnection(GetConnectionString()); 
SqlCommand cmdUpdateTestName = new SqlCommand(setTestNameSQL, conn); 

TextBox tb = (TextBox)e.Item.FindControl("TxtUpdateTestName"); 

SqlParameter u1 = new SqlParameter("@TestName", tb.Text); 
SqlParameter u2 = new SqlParameter("@TestCaseID", e.CommandArgument); 

cmdUpdateTestName.Parameters.Add(u1); 
cmdUpdateTestName.Parameters.Add(u2); 

В противном случае вам не указывайте значения для параметров, так как @ отсутствует, а ваша команда уязвима для sql injection attack.

+0

А, спасибо. Я принял ваш ответ, поскольку он был хорошо детализирован. Я думаю, что я пропустил @ в начале, а затем медленно сделал это хуже, пытаясь «исправить»: P – Goose

+0

На самом деле, он по-прежнему не сохраняется - мой код теперь соответствует тому, что вы предложили, но не обновляет имя теста дело..?? – Goose

+0

@Goose В вашей базе данных есть строка, соответствующая вашей 'TestCaseId'? Проверьте, является ли 'e.CommandArgument' строкой. Если не добавить '.ToString()' – Kai

0

Вы пропустили @ (Symbol) в sqlparamete имя объекта, Для вашего имени объекта параметра Query является @TestName. Но вы использовали SqlParameter Name is @TestName. Запутал @ символ

Try ниже линии для вместо этой строки кода

 SqlParameter u1 = new SqlParameter("**@TestName**", tb.Text); 
0

Вы используете SqlParameters, который является хорошей вещью, поскольку это позволяет избежать Sql Injection но тогда почему вы пропусканием e.CommandArgument напрямую для обновления запроса. поэтому изменить его

string setTestNameSQL = "UPDATE TestCases SET TestName = @TestName WHERE TestCaseID = @TestCaseID"; 

и добавить параметр, как это (не забыл добавить @ перед именем параметра)

SqlParameter u1 = new SqlParameter("@TestName", tb.Text); 
SqlParameter u2 = new SqlParameter("@TestCaseID", e.CommandArgument) 
+0

А, я посмотрю спасибо за этого помощника, оцените его – Goose

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