OVH Cloud OVH Cloud

Derivation de la classe DataRow

5 réponses
Avatar
André Fereau
Bonjour,

Je souhaite utiliser une table composée de rangées dérivée de DataRow. La
difficulté vient du fait que les rangées sont crées à partir de la méthode
NewRow de la table et que le constructeur des occurence de "DataRow" n'est
pas directement accessible. A l'exécution du code ci-dessous j'ai une
exception "invalid cast" sur l'expression "return
((STMTTRNRow)(this.NewRow()));" qui devrait me retourner une instance de
"STMTTRNRow". Où est l'erreur? Y a-t-il un autre moyen d'arriver au résultat
recherché?


Le code :

public class STMTTRNDataTable : DataTable, System.Collections.IEnumerable
{
public STMTTRNRow NewSTMTTRNRow()
{
return ((STMTTRNRow)(this.NewRow()));
}
public System.Collections.IEnumerator GetEnumerator()
{
return this.Rows.GetEnumerator();
}
}

public class STMTTRNRow : System.Data.DataRow
{
private STMTTRNDataTable tableSTMTTRN;
internal STMTTRNRow(DataRowBuilder rb) : base(rb)
{
this.tableSTMTTRN = ((STMTTRNDataTable)(this.Table));
}
}

AFer92

5 réponses

Avatar
Ambassadeur Kosh
"André Fereau" wrote in message
news:OoVsUz%
Bonjour,

Je souhaite utiliser une table composée de rangées dérivée de DataRow. La
difficulté vient du fait que les rangées sont crées à partir de la méthode
NewRow de la table et que le constructeur des occurence de "DataRow" n'est
pas directement accessible. A l'exécution du code ci-dessous j'ai une
exception "invalid cast" sur l'expression "return
((STMTTRNRow)(this.NewRow()));" qui devrait me retourner une instance de
"STMTTRNRow". Où est l'erreur? Y a-t-il un autre moyen d'arriver au
résultat recherché?



oui. un dataset typé, ou, si vous tenez vraiment à avoir votre classe pour
la row et pas une autre, recopiez un dataset typé, et subsitutez partout le
nom de la classe datarow specialisée generée.
ainsi, mecaniquement, vous ne pouvez pas en louper, et il n'y a pas à
reflechir.

mais à mon avi, vous utilisez à contrepied la mécanique. insiprez vous du
dataset typé et comprenez en quoi la présence et l'absence de certains
concepts est cruciale.

voila voila
Avatar
André Fereau
Bonsoir,

Il me semblait justement utiliser un DataSet typé. Je n'ai recopié ici que
la partie de code qui me semblait significative, le gros du code a été
généré avec XSD.EXE à partir d'une définition XSD.

AFer92

"Ambassadeur Kosh" a écrit dans le message de
news: ODUt$
"André Fereau" wrote in message
news:OoVsUz%
Bonjour,

Je souhaite utiliser une table composée de rangées dérivée de DataRow. La
difficulté vient du fait que les rangées sont crées à partir de la
méthode NewRow de la table et que le constructeur des occurence de
"DataRow" n'est pas directement accessible. A l'exécution du code
ci-dessous j'ai une exception "invalid cast" sur l'expression "return
((STMTTRNRow)(this.NewRow()));" qui devrait me retourner une instance de
"STMTTRNRow". Où est l'erreur? Y a-t-il un autre moyen d'arriver au
résultat recherché?



oui. un dataset typé, ou, si vous tenez vraiment à avoir votre classe pour
la row et pas une autre, recopiez un dataset typé, et subsitutez partout
le nom de la classe datarow specialisée generée.
ainsi, mecaniquement, vous ne pouvez pas en louper, et il n'y a pas à
reflechir.

mais à mon avi, vous utilisez à contrepied la mécanique. insiprez vous du
dataset typé et comprenez en quoi la présence et l'absence de certains
concepts est cruciale.

voila voila



Avatar
André Fereau
Bonsoir,

J'ai une solution. En interne le DataRow est un tableau d'objets, il est
donc possible d'alimenter ce tableau directement et d'obtenir un résultat
similaire à celui d'une dérivation de classe. Si les objets sont de type
incorrect une exception est levée (ce qui est recherché dans mon cas). Pour
ma classe STMTTRNDataTable la méthode pour ajouter une ligne est donc :

public DataRow AddSTMTTRNRow(
int BANKACCTFROM,
string FITID,
System.Byte TRNTYPE,
System.DateTime DTPOSTED,
System.DateTime DTUSER,
System.DateTime DTAVAIL,
System.Decimal TRNAMT,
string CHECKNUM,
string SIC,
string PAYEEID,
string NAME,
string MEMO,
System.DateTime DTUPD)
{
DataRow rowSTMTTRNRow = this.NewRow();
rowSTMTTRNRow.ItemArray = new object[] {
BANKACCTFROM,
0,
TRNTYPE,
DTPOSTED,
DTUSER,
DTAVAIL,
TRNAMT,
FITID,
CHECKNUM,
"REFNUM",
SIC,
PAYEEID,
NAME,
MEMO
};
this.Rows.Add(rowSTMTTRNRow);
return rowSTMTTRNRow;
}

L'occurence retournée est bien un DataRow, il n'est pas possible d'accéder
aux champs directement en tant que propriété mais à travers le tableau
d'objets ce qui n'est pas un problème.

Cordialement,

André

"Ambassadeur Kosh" a écrit dans le message de
news: ODUt$
"André Fereau" wrote in message
news:OoVsUz%
oui. un dataset typé, ou, si vous tenez vraiment à avoir votre classe pour
la row et pas une autre, recopiez un dataset typé, et subsitutez partout
le nom de la classe datarow specialisée generée.
ainsi, mecaniquement, vous ne pouvez pas en louper, et il n'y a pas à
reflechir.

mais à mon avi, vous utilisez à contrepied la mécanique. insiprez vous du
dataset typé et comprenez en quoi la présence et l'absence de certains
concepts est cruciale.

voila voila



Avatar
Grumly
Bonsoir,

Pour voir de beaux exemples de datasets fortement typés autrement
qu'avec l'IDE de visual studio, essayez le générateur de code nTierGen.
Il est gratuit, et produit des datasets typés de très bonne facture.

André Fereau wrote:

Bonsoir,

Il me semblait justement utiliser un DataSet typé. Je n'ai recopié ici que
la partie de code qui me semblait significative, le gros du code a été
généré avec XSD.EXE à partir d'une définition XSD.

AFer92

"Ambassadeur Kosh" a écrit dans le message de
news: ODUt$


"André Fereau" wrote in message
news:OoVsUz%


Bonjour,

Je souhaite utiliser une table composée de rangées dérivée de DataRow. La
difficulté vient du fait que les rangées sont crées à partir de la
méthode NewRow de la table et que le constructeur des occurence de
"DataRow" n'est pas directement accessible. A l'exécution du code
ci-dessous j'ai une exception "invalid cast" sur l'expression "return
((STMTTRNRow)(this.NewRow()));" qui devrait me retourner une instance de
"STMTTRNRow". Où est l'erreur? Y a-t-il un autre moyen d'arriver au
résultat recherché?




oui. un dataset typé, ou, si vous tenez vraiment à avoir votre classe pour
la row et pas une autre, recopiez un dataset typé, et subsitutez partout
le nom de la classe datarow specialisée generée.
ainsi, mecaniquement, vous ne pouvez pas en louper, et il n'y a pas à
reflechir.

mais à mon avi, vous utilisez à contrepied la mécanique. insiprez vous du
dataset typé et comprenez en quoi la présence et l'absence de certains
concepts est cruciale.

voila voila











Avatar
André Fereau
Bonsoir,

Merci pour l'info, je regarderai.

André

"Grumly" <"grumly[NOSP]57"@free.fr> a écrit dans le message de news:
42447622$0$5147$
Bonsoir,

Pour voir de beaux exemples de datasets fortement typés autrement qu'avec
l'IDE de visual studio, essayez le générateur de code nTierGen. Il est
gratuit, et produit des datasets typés de très bonne facture.

André Fereau wrote: