2013-10-24 3 views
1

У меня есть база данных с номером заказа & номер отслеживания. Номер порядка уже завершен.C# инструкция обновления с предложением where

У меня есть следующий код для обновления столбца столбца отслеживания в моей базе данных, но он должен только обновлять, где номер порядка соответствует тому, что пользователь вводит. (Пользователь вводит номер заказа и номер отслеживания по умолчанию .aspx)

В настоящий момент код работает нормально. но я заметил проблему im не уверен, как исправить: столбец номер заказа только поднимается до номера 3578, поэтому я ожидал бы, что если пользователь напечатал 3579 или выше, или действительно что-нибудь, что не соответствует номеру порядка, тогда будет выбрано исключение, но вместо этого будет сказано «обновлено». Однако нет номера порядка 3579, его просто нет. так это мой SQL-запрос, который работает неправильно? как у меня есть предложение «Где», или есть что-то еще, что я пропустил?

Код:

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Data; 
    using System.Data.SqlClient; 
    using System.Configuration; 
    using System.Web; 
    using System.Web.UI; 
    using System.Web.UI.WebControls; 

    namespace tracking 
    { 
     public partial class _Default : Page 
     { 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     errorLabel.Visible = false; 
     SuccessLabel.Visible = false; 
    } 

    protected void submitBtn_Click(object sender, EventArgs e) 
    { 
     int _orderID = Convert.ToInt32(orderID.Text); 
     string _trackingID = trackingNumber.Text; 

     SqlConnection myConnection = new SqlConnection("Data Source=MYDATABASESERVER;Initial Catalog=DATABASENAME;User ID=USERNAME;Password=PASSWORD"); 
     SqlCommand myCommand = new SqlCommand("UPDATE Shipment SET TrackingNumber = @tracking WHERE OrderId = @order", myConnection); 

     try 
     { 
      myConnection.Open(); 
      myCommand.Parameters.AddWithValue("@order", _orderID); 
      myCommand.Parameters.AddWithValue("@tracking", _trackingID); 
      myCommand.ExecuteNonQuery(); 
      myConnection.Close(); 
      SuccessLabel.Text = "Thank you, tracking details have been updated"; 
      SuccessLabel.Visible = true; 
      orderID.Text = ""; 
      trackingNumber.Text = ""; 
     } 
     catch (Exception f) 
     { 
      errorLabel.Text = f.Message.ToString(); 
      errorLabel.Visible = true; 
      return; 

     } 






    } 
} 

}

+1

Как в стороне, если есть исключение, ваше соединение останется открытым! Рассмотрим перемещение 'myConenction.Close()' в блок 'Наконец' – Dave

ответ

4

ExecuteNonQuery метод возвращает количество строк. Ваш запрос работает нормально, но строки не обновляются. Поэтому исключений нет.

Ловлю количество обновленных строк, а затем проверить, что:

myConnection.Open(); 
myCommand.Parameters.AddWithValue("@order", _orderID); 
myCommand.Parameters.AddWithValue("@tracking", _trackingID); 
int rowsUpdated = myCommand.ExecuteNonQuery(); 
myConnection.Close(); 
if(rowsUpdated > 0) 
{ 
    SuccessLabel.Text = "Thank you, tracking details have been updated"; 
    SuccessLabel.Visible = true; 
} 
orderID.Text = ""; 
trackingNumber.Text = ""; 
+0

Отлично, спасибо большое. :) – drac

1

Вы скрипт не влияет на какие-либо строки.

Метод ExecuteNonQuery возвращает количество затронутых строк.

if (myCommand.ExecuteNonQuery() == 0) 
{ 
    errorLabel.Text = "Tracking number is not found"; 
    errorLabel.Visible = true; 
} 

Это даст вам есть многие из них были обновлены

0

, потому что команда выполнена успешно, но без обновления строк ExecuteNonQuery() возвращает количество обновленных строк, проверить его первым, чтобы определить, Что у было сделано с помощью сценария.

int res = myCommand.ExecuteNonQuery(); 
    if(res > 0) 
    { 
     Console.WriteLine("Worked"); 
    } 

Не забудьте добавить finally и закрыть соединение.

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