public bool SaveMyDataSet() { bool IsOK = true; long MyPK; this.oConnection.Open(); SqlTransaction oTrans = this.oConnection.BeginTransaction(); SqlCommand sc = new SqlCommand(); sc.CommandType = CommandType.StoredProcedure; sc.Connection = this.oConnection; sc.Transaction = oTrans; DataSet dsChanged = this.MyDataSet.GetChanges(); DataSet dsDeleted = this.MyDataSet.GetChanges(DataRowState.Deleted); if (IsOK == true) IsOK = this.SaveMyData(sc, dsChanged); if (IsOK == true) IsOK = this.DeleteMyData(sc, dsDeleted); // End the open transaction if (IsOK == true) { oTrans.Commit(); MyPK = this.GetKey(dsChanged, "MyPK"); DataSet dsKeys = this.GetMyDataSetKeys(ref Message, MyPK); // this spins through MyDataSet updating the keys from the dsKeys DataSet this.MatchKeys(this.MyDataSet, dsKeys); } else { oTrans.Rollback(); Message = "Transaction rolled back!" + (char)13 + (char)13 + "Changes in Personnel Information were not saved."; } this.oConnection.Close(); return IsOK; } protected bool SaveMyData(SqlCommand Command, MyDataSet Data) { long MyPK; if (Data.Personnel.Rows.Count < 1) return false; try { // -- First, the main table Command.CommandText = "bsp_MyMainTable_Put"; // The SetBasicParameters method loops through every column in the table, setting the parameters. // It will also set the PK parameter's .Direction property to be ParameterDirection.InputOutput this.SetBasicParameters(Command, Data.Tables["MyMainTable"].Rows[0], "MyPK"); Command.ExecuteNonQuery(); MyPK = (long)Command.Parameters["@MyPK"].Value; Data.Tables["MyMainTable"].Rows[0]["MyPK"] = MyPK; // -- The SetKey method goes through every row in every table, setting the ForeignKey // This assumes that all FK's in every table have the same name "MyPK" this.SetKey(Data, MyPK, "MyPK"); // Now that all the FK's are in place, we can update all the child tables for (int i = 0; i < Data.Tables["MyChildTable"].Rows.Count; i++) { Command.CommandText = "bsp_MyChildTable_Put"; this.SetBasicParameters(Command, Data.Tables["MyChildTable"].Rows[i], "MyChildPK"); Command.ExecuteNonQuery(); } for (int i = 0; i < Data.Tables["MySecondChildTable"].Rows.Count; i++) { Command.CommandText = "bsp_MySecondChildTable_Put"; this.SetBasicParameters(Command, Data.Tables["MySecondChildTable"].Rows[i], "MySecondChildPK"); Command.ExecuteNonQuery(); } } catch (SqlException ex) { // Log the error return false; } return true; } protected bool DeleteMyData(SqlCommand Command, MyDataSet Data) { // The Delete stuff is similar }~~Bonnie