IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

[ASP.NET 2.0 et C#] les transactions


Sujet :

ASP.NET

  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    194
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 194
    Par défaut [ASP.NET 2.0 et C#] les transactions
    Bonjour,
    je voudrais savoir comment créer une transaction dans ASP.NET 2.0.
    J'ai deux tables liées par une relation de type many-to-many (donc une troisieme table qui est la table relation). je voudrais créer une transaction pour inserer dans la table parente et la table relation, mais je ne sais pas comment créer cette transact.
    merci d'avance.

  2. #2
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 240
    Par défaut
    cherche DBTransaction qui est une classe abstraite et tu as sqlTransaction pour sql Server OracleTransaction pour oracle et OleDBTransaction pour le reste.

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    194
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 194
    Par défaut
    Bonjour,
    J'utilise un DataSet typé dans une architecture 3 tiers. Je ne sais pas ou exactement placer le code pour les objets sqlTransaction. J'ai pensé aux classes Partielles, mais comment faire exactement, je ne sais pas.
    merci bien de me guider.

  4. #4
    Membre très actif
    Avatar de jpelaho
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Avril 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 120
    Par défaut
    Pour une base de données SQL :
    Crée une nouvelle transaction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SqlTransaction sqlTrans;
    Tu l'initialises
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SqlTrans = sqlConn.BeginTransaction("Ma_transaction");
    Pour tous les traitements que tu vas effectuer sur les données, crée des objets SqlCommand
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SqlCommand sqlCmd = ...
    Que tu associes à la transaction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SqlCmd.Transaction = sqlTrans;
    Ensuite tu les exécutes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SqlCmd.ExecuteNonQuery();
    ...
    Si tu arrives à un stade ou tu veux appliquer toutes les modifications à la base de données, tu fais
    S'il ya une exception ou erreur quelconque, tu fais
    Espérant que ca va t'aider

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    194
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 194
    Par défaut
    Bonjour jpelaho (et tout le monde bien sùr)
    Dans les applications WindowsForms en .NET 2003, je fesais exactement ce que tu a fais et décris, mais en .NET 2005 avec des appli WebForms, je ne trouve pas ou mettre le code. En effet, j'utilise un dataset typé, donc il génère automatiquement un objet DataTable et un TableAdapter pour chaque table. Mon problème c'est que je n'ai pas d'objet sqlConnexion car tout est integré dans les objets DataTable et TableAapter. De plus, à l'inverse de .NET 2003, je n'ai pas accés à la propriété "InsertCommand" de l'Adapter (elle n'existe pas) pour lui affecter l'objet transaction.
    Dans quelle couche de mon architecture 3 tiers je dois inserer ce code ?
    le plus logique serait de le mettre dans la couche accès aux données (pour cela je dois utiliser les classe partielles).
    Je vous dis sincerement, je suis completement perdu. à l'aiiiiiiiiiiiide

  6. #6
    Membre très actif
    Avatar de jpelaho
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Avril 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 120
    Par défaut
    Pour revenir au code donné plus haut il est applicable autant sur .net 2003 que sur 2005 et quelque soit le type d'appli (Web ou Windows)

    J'avoues que je ne comprends plus trop ton problème quand tu parles de classes partielles (c'est pour faire quoi dans ton cas ?)

    As tu pensé à effectuer la transaction à l'aide d'une procédure stockée et l'appeler dans ton code ?

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    194
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 194
    Par défaut
    Bonjour,
    j'avoue aussi que je ne trouve pas comment décrire précisément mon problème, mais pour comprendre, STP crée une appli web utilisant utilisant un DataSet Typé.
    1) -D'abords j'utilise une architecture 3 tiers, pour ça parmi les problèmes que je trouve est celui de l'endroit du code (c-à-d, dans quelle couche de mon architecture).

    2)- l'objet connexion n'existe pas (pas comme en 2003 où on avait un SqlConnection). donc comment faire ça ?
    SqlTrans = sqlConn.BeginTransaction("Ma_transaction");

    3)- à l'inverse de 2003 où j'utilisais des SqlAdapter pour l'accès à la BDD, et qui permet d'affecter aux propriétés xCommand (insert, update et delete) la transaction créée. En 2005 je ne trouve pas comment le faire. donc

    SqlCommand sqlCmd = ...
    et ce code
    SqlCmd.Transaction = sqlTrans;

    je ne sais pas où le placer.

    Bref, si c'est moi qui déclare les SqlCommand et le SqlConnection, ça revient à ne pas utiliser le DataSet typé, et reréflichir toute l'architecture de l'appli.

    J'espere que j'ai bien expliquer mon bleme.

    et merci beaucou.

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    581
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2004
    Messages : 581
    Par défaut
    t'as pas moyen dans la couche business de déclarer une transaction et de passer celle ci dans chaque data ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Trans = new SqlTransation("");
    try
    {
     
    Data.Delete(Objet,Trans);
    Data.Insert(Objet,Trans);
    Data.Update(Objet,Trans);
    Trans.Commit();
     
    }
    catch(Exception)
    Trans.Rollback();
    Fix

  9. #9
    Membre très actif
    Avatar de jpelaho
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Avril 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 120
    Par défaut
    Nkonito, je comprend mieux pourquoi tu parlais de classes partielles.

    En effet sur VS2003, pour étendre le code personnalisé généré par l’utilisation des dataSets Typé, il fallait être sûr de ne jamais modifier la structure du schéma (sinon tout était supprimé lors de la régénération de code)

    Les classes partielles permettent de « customiser » la classe du dataset généré dans un autre fichier qui lui reste intact à chaque génération automatique du code. Et c’est cette solution qui fait que Microsoft poussent les développeurs à utiliser ce type de dataset plutôt que les dataset standart. Bref cet article devrait t’aider à avancer :

    http://www.microsoft.com/france/msdn...tasetVS05.mspx

    Pour ton cas, tu peux ajouter du code pour capter l’insertion dans la table de l’entête et ainsi créer et exécuter ta transaction pour propager les modifications sur les lignes …

    Fix je n'ai pas tres bien compris ce que tu as appélé "data" !

  10. #10
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    194
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 194
    Par défaut
    Merci jpelaho,
    je vais jeter un coup d'oeil, et je te rendrai la réponse.

    fix105, je n'ai pas compris ce que c'est Data dans ton code.

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    581
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2004
    Messages : 581
    Par défaut
    Excusez moi, c'était la couche data, l'appel de cette couche.

    Fix

  12. #12
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    194
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 194
    Par défaut
    C'est une assez bonne piste, je vais voir aussi.
    jpelaho, j'essais de créer des classes partielles pour chaque TableAdapter et d'ecrire mes propres fonctions de Update.
    J'espere que ça va marcher.

  13. #13
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    194
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 194
    Par défaut
    merci jpelaho;
    regarde ce que j'ai fait (exemple):

    j'ai un dataset typé nommé MonDataSet, qui contient une DataTable et une TableAdapter nommées ClientDataTable et ClientTableAdapter respectivement.

    J'ai créé une classe partielle de la classe ClientTableAdapter comme suit:

    namespace MonDataSetTableAdapters
    {
    public partial class ClientTableAdapter
    {
    }

    dans cette classe partielle, j'ai ajouter une fonction UpdateTransact() en utilisant les objets transactions.

    reste un seul problème, car ce que j'ai fais marche trés bien pour une seule table, mais pour plusieurs tables, il faudra penser à la meilleure façon d'implementer ces transactions. en tout cas je vais voir ce que je peux faire, et si toi tu as une idée, je serai prenant.
    merci beaucoup.

  14. #14
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    194
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 194
    Par défaut
    Bonjours,
    La solution au problème est comme suit:

    On génère une classe partielle pour chaque classe (TableAdapter) qui est suceptible d'executer une transaction, pour nous donner accès au sqlDataAdapter de la classe. On crée une fonction [nommée par exemple UpdateTransaction(sqlTransaction trans) ] qui prend comme paramètre un sqlTransaction, et dans cette fonction on initialise les xCommmand du DataAdapter (xCommand : InsertCommand,....).

    Ensuite, on crée une autre classe dans la couche métier (que j'ai nommé TransactionBL). Cette classe comporte 2 propriétés : sqlConnection pour récupérer la connexion à la base. et une sqlTransaction.
    Dans cette classe, on ecrit toutes les fonctions qui necessitent des transactions.

    voila, ça regle assez bien le problème.
    Il y a une solution plus optimale que celle là, mais que je n'arrive pas à trouver comment l'implémenter, car le type TableAdapter n'existe pas.

    Tiens, y a une idée qui me vient à l'esprit

    J'espere que cette discusion reglera le problème de beaucoup de programmeurs, et si quelqu'un trouve une solution plus optimale que ça qu'il me la donne.

    Merci à tout le monde.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/02/2011, 09h28
  2. C# ASP.NET MVC 1.0 eviter les redondances
    Par blackskiz dans le forum ASP.NET MVC
    Réponses: 5
    Dernier message: 19/04/2010, 11h23
  3. Réponses: 5
    Dernier message: 17/01/2008, 13h18
  4. [ASP.NET] URL fixe pour toutes les pages d'un site
    Par Ant8386 dans le forum ASP.NET
    Réponses: 8
    Dernier message: 20/09/2007, 15h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo