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

Accès aux données Discussion :

[2.0] ADO.NET : DataTable : méthode Copy : régression ?


Sujet :

Accès aux données

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 7
    Points : 6
    Points
    6
    Par défaut [2.0] ADO.NET : DataTable : méthode Copy : régression ?
    Bonjour,

    J'essaie de migrer une application .NET 1.1 vers .NET 2.0 et j'ai été surpris par une Exception de type EvaluateException qui a été déclenchée lors d'une copie d'un DataTable un peu particulier certes...

    Je m'explique :

    J'ai un DataSet ds qui contient un DataTable nommé "matable". Je crée un DataRelation (relation parent/enfant) avec deux DataColumn d'un même DataTable. J'ajoute à la collection Relation de mon DataSet, le DataRelation ainsi créé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DataRelation relation;
    DataColumn parent = ds.Tables["matable"].Columns["code"];
    DataColumn enfant = ds.Tables["matable"].Columns["codeParent"];
    relation = new DataRelation("maRelation", parent, enfant);
    ds.Relations.Add(relation);
    J'ajoute une colonne à mon DataTable en effectuant une moyenne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DataColumn col = new DataColumn("nvcol", Type.GetType("System.Decimal"), "Avg(child(maRelation).code)");
    ds.Tables["matable"].Columns.Add(col);
    Jusqu'ici tout ce passe bien en 1.1 et en 2.0.

    Par contre si je crée un nouvau DataTable à partir du DataTable précédent en utilisant la méthode Copy, une EvaluateException est lancée en 2.0 alors qu'en 1.1 çà fonctionne !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DataTable tmp = ds.Table["matable"].Copy();
    Si quelqu'un a déjà été confronté à un problème similaire...

    Merci de votre aide.
    Images attachées Images attachées  

  2. #2
    Futur Membre du Club
    Inscrit en
    Février 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Toujours pas trouvé...
    J'ai cherché sur des sites si un fix existait mais apparemment rien...

    Voici une méthode à faire fonctionner pour ceux qui ont des idées...

    J'utilise une base Oracle 9 avec une table "matable", deux champs INTEGER code (clé primaire) et codeparent.
    Il est nécessaire que la table ne soit pas vide : 1 ligne suffit.

    Cette méthode fonctionne en .NET 1.1 mais pas en .NET 2.0 !!!
    L'exception est levée au moment du Copy().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    private static void TestRelations()
    {
      OracleConnection conn = null;
     
      try
      {
        conn = new OracleConnection("Data Source=TEST;user=TOTO;password=TOTO");
        conn.Open();
     
        string query = "SELECT code, codeparent FROM matable";
     
        OracleDataAdapter adapter = new OracleDataAdapter();
        adapter.SelectCommand = new OracleCommand(query, conn);
     
        DataSet ds = new DataSet();
        ds.CaseSensitive = true;
     
        adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
        adapter.FillSchema(ds, SchemaType.Mapped);
     
        adapter.Fill(ds);
        ds.Tables[0].TableName = "maTable";
        ds.ExtendedProperties.Add("selectCommand", query);
        ds.EnforceConstraints = false;
     
        DataRelation relation;
        DataColumn parent = ds.Tables["matable"].Columns["code"];
        DataColumn enfant = ds.Tables["matable"].Columns["codeparent"];
        relation = new DataRelation("maRelation", parent, enfant);
        ds.Relations.Add(relation);
     
        DataColumn col = new DataColumn("nvcol", Type.GetType("System.Decimal"), "Avg(Child(maRelation).code)");
        ds.Tables["matable"].Columns.Add(col);
     
        DataTable tmp = ds.Tables["matable"].Copy();
      }
      catch (Exception e)
      {
        Console.WriteLine(e.ToString());
      }
      finally
      {
        if (conn != null)
        {
          conn.Close();
          Console.WriteLine("Fermeture de la connexion ok !");
        }
      }
    }
    Merci pour vos suggestions.

Discussions similaires

  1. [ADO.NET] Dataset et DataTable
    Par gibea00 dans le forum Accès aux données
    Réponses: 4
    Dernier message: 15/12/2006, 04h49
  2. [ADO.NET][C#] Comment copier une DataRow d'une DataTable à une autre ?
    Par L`artiste dans le forum Accès aux données
    Réponses: 3
    Dernier message: 29/04/2006, 00h11
  3. Réponses: 1
    Dernier message: 24/03/2006, 18h59
  4. [ADO.NET][VB.Net]Comment réaliser jointure de 2 DataTables ?
    Par prophetky dans le forum Accès aux données
    Réponses: 5
    Dernier message: 17/02/2006, 14h55
  5. [ADO.Net][VB.NET] Comment ajouter une colonne Integer à un DataTable ?
    Par graphicsxp dans le forum Accès aux données
    Réponses: 2
    Dernier message: 20/04/2005, 12h08

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