2012-01-24 3 views
-2

Je rencontre un problème dans MySql.Data.MySqlClient.MySqlTransaction dans une application Windows Communication Foundation Server.WCF, MySQL et Transaction

J'utilise le MySqlTransaction dans la méthode de la classe qui implémente l'interface ServiceContract et il jette cette erreur lorsque je tente d'exécuter le service:

System.Runtime.Serialization.InvalidDataContractException: Type 'MySql.Data.MySqlClient.MySqlTransaction' ne peut pas être sérialisé. Pensez à le marquer avec l'attribut DataContractAttribute et à marquer tous les membres que vous souhaitez sérialiser avec l'attribut DataMemberAttribute. Si le type est une collection, envisagez de la marquer avec CollectionDataContractAttribute.

Mon code en service WCF était simmilar à ceci:

[ServiceContract] 
public interface IDALService 
{ 
    MySqlCommand Command { [OperationContract] get; [OperationContract] set; } 

    [OperationContract] 
    void Execute(string cmdText); 
} 

[ServiceBehavior(IncludeExceptionDetailInFaults = true)] 
public class DALService : IDALService 
{ 
    public MySqlCommand Command { get; set; } 

    public DALService() 
    { 
     Command = null; 
    } 

    public void Execute(string cmdText) 
    { 
     MySqlCommand SQLCom = this.Command??new MySqlCommand(); 
     SQLCom.CommandText = cmdText; 

     if (this.Command == null) 
     { 
      SQLCom.CommandType = CommandType.Text; 
      SQLCom.Connection = new MySqlConnection(/* ... */); 
      SQLCom.Connection.Open(); 
      SQLCom.Transaction = SQLCom.Connection.BeginTransaction(); 
     } 

     if (this.Command == null) 
     { 
      try 
      { 
       SQLCom.ExecuteScalar(); 
       SQLCom.Transaction.Commit(); 
      } 
      catch { SQLCom.Transaction.Rollback(); throw; } 
      finally { SQLCom.Connection.Close(); } 
     } 
     else SQLCom.ExecuteScalar(); 
    } 
} 

L'erreur se produit en tapant simplement le http://localhost:1257/DALService.svc dans mon navigateur web. J'utilise Framework 4, code en C#, dans Microsoft Visual Studio 2010 Pro.

Aidez-nous s'il vous plaît. Merci d'avance.

+0

Ceci n'est pas votre méthode Execute complète, ou cela ne compile pas. Je ne vois pas de déclaration de retour. Nous devrions commencer par quelque chose qui compile. –

+0

J'ai mis à jour ma question (changez le type de retour en void, et supprimez la variable 'Result' dans l'instruction try) –

+0

Est-ce la seule méthode dans DALService? –

Répondre

2

Cela ne peut pas être le code à l'origine d'un problème. L'erreur que vous obtenez provient d'une tentative de renvoi ou de transfert d'une transaction MySqlTransaction vers/depuis le service. C'est juste que ça ne va pas marcher.

Aussi, pourquoi diable exposes-tu un objet Command au monde extérieur via une propriété publique? De plus, il ne semble même pas que vous l'utilisiez ... Supprimez cette propriété et gardez votre commande portée à la méthode qui l'utilise. Si vous ne le faites pas et que vous exécutez ce service en tant que singleton, vous aurez beaucoup de bugs fous.

Encore plus ... C'est un service extrêmement dangereux à exposer. Si vous deviez utiliser quelqu'un d'autre que vous-même, cela n'assure aucune encapsulation. Heck, vous pourriez aussi bien ouvrir un port directement sur le serveur SQL, aussi stupide que cela puisse paraître.

+0

Je l'utilise lorsque je souhaite invoquer la méthode Execute plusieurs fois avec une seule connexion, je l'ai annulée ou validée en dehors du service. Donc vous dites que je ne peux pas passer MySQLCommand en WCF? –

+0

Non, vous ne pouvez pas. Ça ne va pas être sérialisable. Tout ce que vous transmettez à un service WCF doit être sérialisable. Pensez-y, comment représentez-vous un objet de commande en tant que chaîne XML (je sais qu'il existe d'autres méthodes pour sérialiser)? La réponse est, vous ne pouvez pas. – Darthg8r

+0

Je pense que votre meilleur pari ici est d'utiliser un modèle de commande, et passer dans ceux dans le service WCF, puis traduire les commandes dans MySQLCommands sur le côté serveur. – Darthg8r