2009-05-09 6 views
0

J'ai une classe qui est un miroir de table.RollBack ou Commit (Enterprise Library Transaction) sur les classes lorsque l'autre classe obtient le résultat C#

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

J'ai une autre classe qui utilise Patient. Avant de l'utiliser, il définit de nouvelles valeurs pour une instance de la classe Patient, ainsi je peux envoyer la dernière valeur au service Web. (En fait, je dois écrire db avant que j'utiliser le service web qui n'est pas dans mon projet)

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

Si je reçois exception ou faux résultat, moi Avez-vous suggérer comment puis-je gérer ??

Je veux utiliser TRANSACTION (parce que je ne veux pas redéfinir la même ligne.) Mais COMMENT?

Merci à des conseils ...

+0

Un peu d'informations secondaires. J'espère que cela ne vous dérange pas, je n'essaie pas de salut-jack le fil. Comme un conseil amical, la façon dont vous faites votre mise à jour SQL est très dangereuse, et devrait être évitée à tout prix. Name = « » + _patient.Name + « ' » Cela devrait être changé à une requête paramétrée, comme cette concat chaîne directement dans SQL rend le fonctionnement de votre serveur/services ensemble très sensibles à l'injection SQL . [Ici est un lien vers une bonne injection de sql et comment l'éviter.] [1] [1]: http://stackoverflow.com/questions/1973/what-is-the-best-way-to-avoid -sql-injection-attaques – ScottCate

Répondre

0

Vous pouvez implémenter l'interface System.ComponentModel.IEditableObject et utiliser cette entité comme ce code

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 

Exemple seulement pour la propriété Sexe

// 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 
+0

merci pour votre réponse. – uzay95

Questions connexes