views:

615

answers:

1

I have a class which is mirror of table.

    public class Patient
    {
        public int Patient_id { get; set; }
        public string Name { get; set; }
        public string Address { get; set; }
        public bool Sex { get; set; }

        public Patient f_UpdatePatient(Patient _patient)
        {
            string QUpdate = "  UPDATE Patients "
                             + "   SET Name    = '" + _patient.Name + "'"
                             + "      ,Address = '" + _patient.Address + "'"
                             + "      ,Sex = " + (_patient.Sex ? "M" : "F")
                             + " WHERE patient_id = " + _patient.Patient_id;

            Database db1 = DatabaseFactory.CreateDatabase("cnnStr");
            DataSet ds = db1.ExecuteDataSet(CommandType.Text, QUpdate);

            // First, How can i set my instance which is coming as a parameter 
            // to my real object. Without passing each value to eac prop of obj.
            return this = _patient;
        }
    }

I have another class which uses Patient. Before use it, it is setting new values to one instance of Patient class, thus i can send the last value to web service. (In fact i need to write db before i use web service which is not in my project)

    public class ServiceConnection
    {
        public static void Main(string[] args)
        {
            Patient pt = new Patient(12);

            // Just want to show that i need DB update.
            pt.Name = args[0];
            pt.Address = args[1];

            try
            {
                // Now i am connection web service and sending pt instance
                bool isOk = f_SendToService(pt);
            }
            catch (Exception ex)
            {
                // Now, at this point, I WANT TO ROLLBACK MY UPDATE with TRANSACTION 
                // or something else
                throw (ex);
            }
        }

        private static bool f_SendToService(Patient pt)
        {
            // trying to send. But sometimes, i get timeout errors
            // sometimes i get false result.
            throw new WebException("Sorry it couldn't reach to WS");
        }
    }

If i get exception or false result, do you have any suggest to me about how can i handle it??

I want to use TRANSACTION (because i don't want to set same row again.) but HOW?

Thanks in advice ...

A: 

You could implement System.ComponentModel.IEditableObject interface and use that entity like this

  Patient pt = new Patient(12);
  pt.BeginEdit();
  pt.Name = args[0];
  pt.Address = args[1];
  if (WSCallIsOK())
     pt.EndEdit();       // save is OK
  else
     pt.CancelEdit();   // sets values back

Example code only for property Sex

// holds backup of values
private string __Sex;
private string _Sex;
public string Sex
{
    get
    {
     return _Sex;
    }
    set
    {
     bool changed = _Sex != value;
       if (changed)
      {
       this.RaisePropertyChanged("Sex");
      }

    }
}


#region IEditableObject Members

private bool _editing = false;

public void BeginEdit()
{
    if (!_editing)
    {
     // create copy of property
     __Sex = _Sex;
     //other properties here
     _editing = true;
    }
}

public void CancelEdit()
{
    if (_editing)
    {
     // revert back
     _Sex = __Sex;
     //other properties here
     _editing = false;

    }
}

public void EndEdit()
{
    if (_editing)
    {
     _editing = false;
    }
}

#endregion
Peter Gfader
thank you for your answer.
uzay95