2014-04-21 100 views
0

我正在Northwind數據庫上覆制這個demo。代碼沒有顯示任何錯誤,但所有插入/更新/刪除操作都只是暫時的。如果我在下一次運行代碼時添加記錄或取消或更新,表格的內容仍然是原始內容,而沒有我在db中保存的任何修改。取消/插入/更新沒有保存到數據庫

private static DataTable GetDataTable(string queryString) 
    { 
     String connString = ConfigurationManager.ConnectionStrings["NORTHWNDConnectionString"].ConnectionString; 
     SqlConnection mySqlConnection = new SqlConnection(connString); 
     SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter(); 
     mySqlDataAdapter.SelectCommand = new SqlCommand(queryString, mySqlConnection); 

     DataTable myDataTable = new DataTable(); 
     mySqlConnection.Open(); 
     try 
     { 
      mySqlDataAdapter.Fill(myDataTable); 
     } 
     finally 
     { 
      mySqlConnection.Close(); 
     } 

     return myDataTable; 
    } 

    private DataTable Employees 
    { 
     get 
     { 
      object obj = this.Session["Employees"]; 
      if ((!(obj == null))) 
      { 
       return ((DataTable)(obj)); 
      } 
      DataTable myDataTable = new DataTable(); 
      myDataTable = GetDataTable("SELECT * FROM Employees"); 
      this.Session["Employees"] = myDataTable; 
      return myDataTable; 
     } 
    } 

    protected void RadGrid1_NeedDataSource(object source, GridNeedDataSourceEventArgs e) 
    { 
     this.RadGrid1.DataSource = this.Employees; 
     this.Employees.PrimaryKey = new DataColumn[] { this.Employees.Columns["EmployeeID"] }; 
    } 

    protected void RadGrid1_UpdateCommand(object source, GridCommandEventArgs e) 
    { 
     GridEditableItem editedItem = e.Item as GridEditableItem; 
     UserControl userControl = (UserControl)e.Item.FindControl(GridEditFormItem.EditFormUserControlID); 

     //Prepare new row to add it in the DataSource 
     DataRow[] changedRows = this.Employees.Select("EmployeeID = " + editedItem.OwnerTableView.DataKeyValues[editedItem.ItemIndex]["EmployeeID"]); 

     if (changedRows.Length != 1) 
     { 
      RadGrid1.Controls.Add(new LiteralControl("Unable to locate the Employee for updating.")); 
      e.Canceled = true; 
      return; 
     } 

     //Update new values 
     Hashtable newValues = new Hashtable(); 

     newValues["Country"] = (userControl.FindControl("TextBox7") as TextBox).Text; 
     newValues["City"] = (userControl.FindControl("TextBox8") as TextBox).Text; 
     newValues["Region"] = (userControl.FindControl("TextBox9") as TextBox).Text; 
     newValues["HomePhone"] = (userControl.FindControl("HomePhoneBox") as RadMaskedTextBox).Text; 
     newValues["BirthDate"] = (userControl.FindControl("BirthDatePicker") as RadDatePicker).SelectedDate.ToString(); 
     newValues["TitleOfCourtesy"] = (userControl.FindControl("ddlTOC") as DropDownList).SelectedItem.Value; 

     newValues["Notes"] = (userControl.FindControl("TextBox1") as TextBox).Text; 
     newValues["Address"] = (userControl.FindControl("TextBox6") as TextBox).Text; 
     newValues["FirstName"] = (userControl.FindControl("TextBox2") as TextBox).Text; 
     newValues["LastName"] = (userControl.FindControl("TextBox3") as TextBox).Text; 
     newValues["HireDate"] = (userControl.FindControl("HireDatePicker") as RadDatePicker).SelectedDate.ToString(); 
     newValues["Title"] = (userControl.FindControl("TextBox4") as TextBox).Text; 

     changedRows[0].BeginEdit(); 
     try 
     { 
      foreach (DictionaryEntry entry in newValues) 
      { 
       changedRows[0][(string)entry.Key] = entry.Value; 
      } 
      changedRows[0].EndEdit(); 
      this.Employees.AcceptChanges(); 
     } 
     catch (Exception ex) 
     { 
      changedRows[0].CancelEdit(); 

      Label lblError = new Label(); 
      lblError.Text = "Unable to update Employees. Reason: " + ex.Message; 
      lblError.ForeColor = System.Drawing.Color.Red; 
      RadGrid1.Controls.Add(lblError); 

      e.Canceled = true; 
     } 
    } 

    protected void RadGrid1_InsertCommand(object source, GridCommandEventArgs e) 
    { 
     UserControl userControl = (UserControl)e.Item.FindControl(GridEditFormItem.EditFormUserControlID); 

     //Create new row in the DataSource 
     DataRow newRow = this.Employees.NewRow(); 

     //Insert new values 
     Hashtable newValues = new Hashtable(); 

     newValues["Country"] = (userControl.FindControl("TextBox7") as TextBox).Text; 
     newValues["City"] = (userControl.FindControl("TextBox8") as TextBox).Text; 
     newValues["Region"] = (userControl.FindControl("TextBox9") as TextBox).Text; 
     newValues["HomePhone"] = (userControl.FindControl("HomePhoneBox") as RadMaskedTextBox).Text; 
     newValues["BirthDate"] = (userControl.FindControl("BirthDatePicker") as RadDatePicker).SelectedDate.ToString(); 
     newValues["TitleOfCourtesy"] = (userControl.FindControl("ddlTOC") as DropDownList).SelectedItem.Value; 

     newValues["Notes"] = (userControl.FindControl("TextBox1") as TextBox).Text; 
     newValues["Address"] = (userControl.FindControl("TextBox6") as TextBox).Text; 
     newValues["FirstName"] = (userControl.FindControl("TextBox2") as TextBox).Text; 
     newValues["LastName"] = (userControl.FindControl("TextBox3") as TextBox).Text; 
     newValues["HireDate"] = (userControl.FindControl("HireDatePicker") as RadDatePicker).SelectedDate.ToString(); 
     newValues["Title"] = (userControl.FindControl("TextBox4") as TextBox).Text; 

     //make sure that unique primary key value is generated for the inserted row 
     newValues["EmployeeID"] = (int)this.Employees.Rows[this.Employees.Rows.Count - 1]["EmployeeID"] + 1; 
     try 
     { 
      foreach (DictionaryEntry entry in newValues) 
      { 
       newRow[(string)entry.Key] = entry.Value; 
      } 
      this.Employees.Rows.Add(newRow); 
      this.Employees.AcceptChanges(); 
     } 
     catch (Exception ex) 
     { 
      Label lblError = new Label(); 
      lblError.Text = "Unable to insert Employees. Reason: " + ex.Message; 
      lblError.ForeColor = System.Drawing.Color.Red; 
      RadGrid1.Controls.Add(lblError); 

      e.Canceled = true; 
     } 
    } 
    protected void RadGrid1_DeleteCommand(object source, GridCommandEventArgs e) 
    { 
     string iD = (e.Item as GridDataItem).OwnerTableView.DataKeyValues[e.Item.ItemIndex]["EmployeeID"].ToString(); 
     DataTable employeeTable = this.Employees; 
     if (employeeTable.Rows.Find(iD) != null) 
     { 
      employeeTable.Rows.Find(iD).Delete(); 
      employeeTable.AcceptChanges(); 
     } 
    } 

爲什麼我的插入/刪除/更新只是臨時的,並且在當前會話中可見?我該如何解決這個問題,以便插入/更新/刪除更改數據庫中的數據?

+0

你究竟在哪裏將數據保存回數據庫? – dotNET

+0

@dotNET,是的,我想保存回數據庫。 – Nullbyte

回答

0

確認Rows.Add()AcceptChanges()不會向底層數據庫寫入任何內容。它們僅對內存數據結構(如DataTable和DataSet)進行操作。要真正保存更改,您必須:

  1. 要麼使用TableAdapter.Update()方法,並提供修改後的DataTable它。
  2. 使用SqlCommand並手動執行UPDATEINSERTDELETE命令。

發送更改回數據庫之前,必須先不要撥打AcceptChanges()

+0

謝謝你的解釋。我會盡量按照你的推薦。然而,如果你可以發佈我需要對上面的代碼進行修改,那麼成爲一名非常自學的初學者會非常有幫助。這將支持我理解如何去做,並最終學習它。 – Nullbyte

+0

我已經使用了多年的鍵入DataSets這種東西,我建議你走這條路。對於這些基本的CRUD操作,VS和.NET可以爲你做很多工作。瞭解Internet上的Typed DataSets。有無數的好資源可用。 – dotNET

+0

謝謝。如果我能做到的話,我不會在這裏尋求幫助。 – Nullbyte