2014-04-21 59 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