2014-01-19 7 views
2

В настоящее время я изучаю веб-разработчик и изучаю ASP.NET WEBFORMS. У меня есть вопрос относительно DataAdapter и Обновление/Удаление таблицы.DataAdapter, какой метод обновления?

Я хочу знать, что это правильный способ сделать это. Допустим, у меня есть этот метод.

Метод обновления

public void UpdateDataTable() 
    { 
     SqlConnection conn = new SqlConnection(strcon); 
     SqlDataAdapter da = null; 
     DataSet ds = null; 
     DataTable dt = null; 
     string sqlsel = "SELECT ActId, Title FROM Act WHERE ArtistId = " + Session["UserId"]; 

     try 
     { 
      da = new SqlDataAdapter(); 
      da.SelectCommand = new SqlCommand(sqlsel, conn); 

      ds = new DataSet(); 
      da.Fill(ds, "MyTable"); 

      dt = ds.Tables["MyTable"]; 

      Gridview1.DataSource = dt; 
      Gridview1.DataBind(); 
     } 
     catch (Exception ex) 
     { 
      LabelMessage.Text = ex.Message; 
     } 
     finally 
     { 
      conn.Close();    
     } 
    } 

Я называю этот метод, когда на страницы загружаются в (!Page.IsPostBack). Поэтому мой вопрос заключается в том, что DataSet сохраняет все в памяти (DataTable тоже). И я хочу снова обновить одну строку с объектом DataAdapter, какой метод лучше всего использовать? В событии клика.

Метод 1

protected void ButtonUpdate_Click1(object sender, EventArgs e) 
    { 
     SqlConnection conn = new SqlConnection(strcon); 
     SqlDataAdapter da = null; 
     string sqlupd = "UPDATE [Act] SET [Title] = @Title, [Description] = @Description, [Duration] = @Duration WHERE [ActId] = @ActId"; 

     try 
     { 

      conn.Open(); 
      da = new SqlDataAdapter(); 

      da.UpdateCommand = new SqlCommand(sqlupd, conn); 

      da.UpdateCommand.Parameters.AddWithValue("@Title", TextBoxTitle.Text); 
      da.UpdateCommand.Parameters.AddWithValue("@Description", TextBoxText.Text); 
      da.UpdateCommand.Parameters.AddWithValue("@Duration", TextBoxDuration.Text); 
      da.UpdateCommand.Parameters.AddWithValue("@ActId", LabelID.Text); 

      da.UpdateCommand.ExecuteNonQuery(); 

     } 
     catch (Exception ex) 
     { 
      LabelMessage.Text = "" + ex.Message; 
     } 
     finally 
     { 
      conn.Close(); 
     } 
     // Call the Update Method 
     UpdateDataTable(); 
} 

Или лучше, чтобы заполнить все снова, и поместить его в DataSet -> DataTable? Как это.

Метод 2

protected void ButtonUpdate_Click1(object sender, EventArgs e) 
     { 
      SqlConnection conn = new SqlConnection(strcon); 
      SqlDataAdapter da = null; 
      DataSet ds = null; 
      DataTable dt = null; 
      SqlCommand cmd = null; 
      string sqlsel = "SELECT * FROM Act WHERE ArtistId = " + Session["UserId"]; 
      string sqlupd = "UPDATE [Act] SET [Title] = @Title, [Description] = @Description, [Duration] = @Duration WHERE [ActId] = @ActId"; 

      try 
      { 

       da = new SqlDataAdapter(); 


       da = new SqlDataAdapter(); 
       da.SelectCommand = new SqlCommand(sqlsel, conn); 

       ds = new DataSet(); 
       da.Fill(ds, "MyTable"); 

       dt = ds.Tables["MyTable"]; 

       dt.Rows[Gridview1.SelectedIndex]["Title"] = TextBoxTitle.Text; 
       dt.Rows[Gridview1.SelectedIndex]["Description"] = TextBoxText.Text; 
       dt.Rows[Gridview1.SelectedIndex]["Duration"] = TextBoxDuration.Text; 


       // UPDATE 
       cmd = new SqlCommand(sqlupd, conn); 
       cmd.Parameters.Add("@Title", SqlDbType.NVarChar, 50, "Title"); 
       cmd.Parameters.Add("@Description", SqlDbType.Text, 250, "Description"); 
       cmd.Parameters.Add("@Duration", SqlDbType.Int, 4, "Duration"); 

       SqlParameter parm = cmd.Parameters.Add("@ActId", SqlDbType.Int, 4, "ActId"); 
       parm.SourceVersion = DataRowVersion.Original; 

       da.UpdateCommand = cmd; 
       da.Update(ds, "MyAct"); 

      } 
      catch (Exception ex) 
      { 
       LabelMessage.Text = "" + ex.Message; 
      } 
      finally 
      { 
       conn.Close(); 
      } 
      UpdateDataTable(); 
; 
     } 

Так какой метод лучше всего использовать? И почему? :)

+1

Почему веб-формы ?! В любом случае, ваши данные должны появляться в виде сервиса, т. Е. Вы не получаете доступ к db из пользовательского интерфейса, страницы позади. А это означает, что наборы данных и не являются вашим лучшим выбором. Если вы учитесь, по крайней мере, попытайтесь изучить хорошие практики с самого начала, гораздо труднее изменить свои привычки позже – MikeSW

+0

Спасибо за ответ MikeSW! Ну почему веб-формы? Я задал себе тот же вопрос, но это часть учебного плана. Поэтому мы вынуждены это изучить, после этого семестра я рассмотрю .NET MVC :) Но это на самом деле из школьного проекта (уже доставлено), и одна из целей заключалась в том, что вы должны использовать DataAdapter, я знаю, что в этом случае DataReader для чтения таблицы и простой команды с ExecuteNonQuery мог бы работать лучше, так как я работаю только с одной таблицей. – Sigils

+0

Если это для школы, не волнуйтесь, надеюсь, вам это не понадобится в реальном мире. – MikeSW

ответ

0

Ни один из них не является хорошим выбором, поэтому любой код DAL в коде/контроллере/представлении является БОЛЬШИМ нету и является очень недальновидной практикой кодирования. У вас должны быть некоторые базовые классы пространства имен Model, BusinessLogic и DAL для работы.

+0

Спасибо, ласковый, не знал этого. Но, к сожалению, именно так они учили нас в моей школе: /. Но я рад, что вы говорите мне, как все должно быть ДЕЙСТВИТЕЛЬНО! – Sigils