取消/插入/更新未保存到数据库

本文关键字:数据库 保存 更新 插入 取消 | 更新日期: 2023-09-27 17:59:13

我正在Northwind数据库上复制这个演示。代码没有显示任何错误,但所有插入/更新/删除操作都只是临时操作。如果我添加了一条记录,或者在下次运行代码时取消或更新,那么表的内容仍然是原始的,没有保存在数据库中的任何修改。

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();
       }
  }

为什么我的插入/删除/更新只是临时的并且在当前会话中可见?如何修复此问题以插入/更新/删除更改数据库中的数据?

取消/插入/更新未保存到数据库

确认Rows.Add()AcceptChanges()不会向底层数据库写入任何内容。它们只对内存中的数据结构(如DataTables和DataSets)进行操作。要真正保存更改,您必须:

  1. 使用TableAdapter.Update()方法,然后将修改后的DataTable提供给它
  2. 使用SqlCommand并手动执行UPDATEINSERTDELETE命令

在将更改发送回数据库之前,不得调用AcceptChanges()