[C#] DataRow et SQLDataReader, code identique ???

DataRow et SQLDataReader, code identique ??? [C#] - C#/.NET managed - Programmation

Marsh Posté le 13-02-2007 à 09:52:57    

Hello,
 
J'initialise un objet en fonction d'un DataRow ou d'un SQLDataReader.
Actuellement je suis contraint de créer deux méthodes, une pour le DataRow et une autre pour leSQLDataReader.
Le code est identique dans les deux méthodes.
 
Ces deux méthodes n'héritent pas d'une même classe ce qui m'aurait permis éventuellement de ne créer qu'une méthode prenant en compte le SQLDataReader et le DataRow et ainsi de ne modifier le code qu'à un unique endroit et non pas à deux actuellement.
 
J'aimerai savoir s'il y a une méthode permettant de prendre en compte les SQLDataReader ainsi que le DataRow simultanément ?
 
Exemple,
 
Actuellement :
 

Code :
  1. public void InitProperties( SqlDataReader DR)
  2. {
  3. Personne P = new Personne();
  4. P.id = Convert.ToInt32( DR["id"] );
  5. P.nom = DR["nom"].ToString();
  6. }
  7. public void InitProperties( DataRow DR)
  8. {
  9. Personne P = new Personne();
  10. P.id = Convert.ToInt32( DR["id"] );
  11. P.nom = DR["nom"].ToString();
  12. }


 
Comme on peut le voir le code est doublée.
 
Et moi je souhaiterai plutot :
 

Code :
  1. public void InitProperties( XXXX DR)
  2. {
  3. Personne P = new Personne();
  4. P.id = Convert.ToInt32( DR["id"] );
  5. P.nom = DR["nom"].ToString();
  6. }


 
C'est possible ?


Message édité par Clarkent le 13-02-2007 à 11:32:44
Reply

Marsh Posté le 13-02-2007 à 09:52:57   

Reply

Marsh Posté le 13-02-2007 à 10:13:34    

Code :
  1. public void InitProperties<T>(T t)
  2. {
  3.    Personne P = new Personne();
  4.    P.id = Convert.ToInt32(t["id"]);
  5.    P.nom = t["nom"].ToString();
  6. }


 
et tu appelles ta fonction comme ceci en fonction du type :

Code :
  1. InitProperties<SqlDataReader>(DR); // pour un SqlDataReader
  2. InitProperties<DataRow>(DR); // pour un DataRow


 
Attention : ce code n'est valable qu'en C# 2.0+

Reply

Marsh Posté le 13-02-2007 à 11:33:12    

Harkonnen a écrit :

Code :
  1. public void InitProperties<T>(T t)
  2. {
  3.    Personne P = new Personne();
  4.    P.id = Convert.ToInt32(t["id"]);
  5.    P.nom = t["nom"].ToString();
  6. }


 
et tu appelles ta fonction comme ceci en fonction du type :

Code :
  1. InitProperties<SqlDataReader>(DR); // pour un SqlDataReader
  2. InitProperties<DataRow>(DR); // pour un DataRow


 
Attention : ce code n'est valable qu'en C# 2.0+


;), merci, mais en effet je suis avec le framework 1.1 :(.

Reply

Marsh Posté le 13-02-2007 à 11:36:48    

Code :
  1. public class DrOrReader
  2. {
  3.  private Type CurrentType;
  4.  private System.Data.IDataReader reader;
  5.  private System.Data.DataRow datarow;
  6.  /// <summary>
  7.  /// Constructeur
  8.  /// </summary>
  9.  /// <param name="datarowsorreader">DataRowCollection or DataReader</param>
  10.  public DrOrReader(object datarowsorreader)
  11.  {
  12.   if(datarowsorreader is IDataReader)
  13.   {
  14.    this.CurrentType = typeof(IDataReader);
  15.    this.reader = (IDataReader)datarowsorreader;
  16.   }
  17.   else if(datarowsorreader is DataRow)
  18.   {
  19.    this.CurrentType = typeof(DataRow);
  20.    this.datarow = (DataRow)datarowsorreader;
  21.   }
  22.   else
  23.    throw new Exception("T'es une buze, fô coller un datareader ou un datarow" );
  24.  }
  25.  public object this[ string ColumnName ] 
  26.  {
  27.   get 
  28.   {
  29.    if(CurrentType.Equals(typeof(IDataReader)))
  30.     return(reader[ColumnName]);
  31.    else if(CurrentType.Equals(typeof(DataRowCollection)))
  32.     return(datarow[ColumnName]);
  33.    else
  34.     throw new Exception("pffff...." );
  35.   }
  36.  }

Reply

Marsh Posté le 13-02-2007 à 11:36:49    

dans ce cas, faut jouer avec le réflection :spamafote:

 

edit: putain, grilled à une seconde près :fou:

Message cité 1 fois
Message édité par Harkonnen le 13-02-2007 à 11:37:30
Reply

Marsh Posté le 13-02-2007 à 11:41:46    

Harkonnen a écrit :

dans ce cas, faut jouer avec le réflection :spamafote:
 
edit: putain, grilled à une seconde près :fou:


 
moué, mais je rentre pas dans les mécanisme obscures de la refelction là :D, j'utilise la manière "Simple à maintenir pour les collegues qui captent deja pas grands chose au framework :D"

Reply

Marsh Posté le 13-02-2007 à 11:54:54    

et c'est là qu'on voit que les generics c'est quand même plus pratique :o

Reply

Marsh Posté le 13-02-2007 à 12:01:41    

Harkonnen a écrit :

et c'est là qu'on voit que les generics c'est quand même plus pratique :o


 
Je sais... Le pire, c'est qu'aprés avoir pratiqué pas mal de .NET 2.0, je suis obligé aujourd'hui de refaire du 1.0, c'est frustrant :/

Reply

Marsh Posté le 13-02-2007 à 12:02:31    

ha ouais pas mal l'idée.
 
la reflexion c'est sympa mais je prefere eviter, on a vite fait de s'en servir de travers et rendre des choses simples tres complexes.
 
En tous cas merci ;).

Reply

Marsh Posté le 13-02-2007 à 12:04:03    

Clarkent a écrit :

ha ouais pas mal l'idée.
 
la reflexion c'est sympa mais je prefere eviter, on a vite fait de s'en servir de travers et rendre des choses simples tres complexes.
 
En tous cas merci ;).


 
Oué, attention, c'est brut de fonderie, ça compile, mais faut affiner un peu le biniou :D

Reply

Marsh Posté le 13-02-2007 à 12:04:03   

Reply

Marsh Posté le 13-02-2007 à 12:06:24    

Clarkent a écrit :

ha ouais pas mal l'idée.
 
la reflexion c'est sympa mais je prefere eviter, on a vite fait de s'en servir de travers et rendre des choses simples tres complexes.
 
En tous cas merci ;).


ben le code qu'il t'a pondu utilise un peu la réflection :o

Reply

Marsh Posté le 13-02-2007 à 12:09:42    

Harkonnen a écrit :

ben le code qu'il t'a pondu utilise un peu la réflection :o


 
Oué, mais c'est caché :D on n'y voit pas les MethodInfos et autres joyeusetés de la reflexivité pure et dure [:ddr555]

Reply

Marsh Posté le 13-02-2007 à 12:15:03    

Harkonnen a écrit :

ben le code qu'il t'a pondu utilise un peu la réflection :o

ouais un peu, mais j'ai fais bien pire sans aller trop loin :D, et tout ca pour réécrire une sorte de mécanisme d'héritage suite a une programmation un peu bancale :D.
 
Même si ca ne compile pas, je vois l'idée merci ;).

Message cité 1 fois
Message édité par Clarkent le 13-02-2007 à 12:15:18
Reply

Marsh Posté le 13-02-2007 à 12:18:35    

Clarkent a écrit :

ouais un peu, mais j'ai fais bien pire sans aller trop loin :D, et tout ca pour réécrire une sorte de mécanisme d'héritage suite a une programmation un peu bancale :D.
 
Même si ca ne compile pas, je vois l'idée merci ;).


 
 
Sisi ça compile :D

Reply

Marsh Posté le 14-02-2007 à 11:17:11    

Petite question, pardonnez mon manque de savoir :p, mais que signifie cette écriture ?

Code :
  1. public object this[ string ColumnName ]

Reply

Marsh Posté le 14-02-2007 à 11:24:42    

en fait je crois que j'ai compris tout seul :D.
C'est l'assesseur :D.

Reply

Marsh Posté le 14-02-2007 à 11:27:55    

Clarkent a écrit :

en fait je crois que j'ai compris tout seul :D.
C'est l'assesseur :D.


 
arf, trop rapide  :p

Reply

Marsh Posté le 14-02-2007 à 11:37:58    

Je ne me doutais pas qu'on pouvait l'écrire ainsi n'importe ou :).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed