2012-05-30 2 views
0

Je suis à la question suivante: J'ai une méthode qui retourne un SqlDataReader, puis-je faire un certain temps dans cette SqlDataReader que vous voyez ci-dessous:Passe SqlDataReader Comme paramètre

using (SqlDataReader objSqlDtReader = objDtAccess.GetDataReader()) 
{ 
    while(objSqlDtReader.Read()) 
    { 
      UserEntitie objUserEntitie = new UserEntitie(); 
      objUserEntitie.Name = Convert.ToString(objSqlDtReader["name"])  
    } 
} 

Alors, je dois remplissez tout mon UserEntite avec toutes les données, le nom, l'email, l'identification. Mais j'ai beaucoup de méthodes dans la classe d'utilisateur en tant que (GetUserById, GetUserByEmai, GetAllUsers), et je dois remplir une nouvelle fois des données.

Je dois créer une méthode privée qui remplit mon UserEntitie et dans chaque méthode j'appelle seulement ma méthode FillUser et retourne son. Je pense que je dois passer mon SqlDataReader à ma méthode privée FillUser.

Des suggestions pour cela?

+1

Impossible d'obtenir le problème. Vous avez déjà décidé quoi faire. – Reniuz

Répondre

1

Vous pouvez faire quelque chose comme ceci:

class UserEntitie 
{ 
    internal void FillFromSqlDataReader(SqlDataReader reader) 
    { 
     this.Name = Convert.ToString(reader["name"]); 
     /* Fill your fields */ 
    } 
} 

Utilisation:

using (SqlDataReader objSqlDtReader = objDtAccess.GetDataReader()) 
{ 
    while(objSqlDtReader.Read()) 
    { 
     UserEntitie objUserEntitie = new UserEntitie(); 
     objUserEntitie.FillFromSqlDataReader(objSqlDtReader); 
     /* Add to a list or something */  
    } 
} 
1

J'utilise une sorte de système similaire, mais au lieu de passer le SqlDataReader dans l'objet privé, je place passer une SqlConnection dans l'objet et avoir une méthode privée FillDetailsFromDb() qui effectue le travail nécessaire. Donc, au lieu de passer un SqlDataReader, j'aurai un constructeur sans paramètre ainsi qu'un constructeur qui prend comme paramètre SqlConnection. Quand j'ai créé l'objet, je vais passer un paramètre (dans mon cas son un Guid) dans l'objet et ma méthode privée utilise le SqlConnection avec lequel il a été construit avec une nouvelle SqlCommand qui prend le paramètre que j'ai envoyé à la méthode publique.

private void FillDetailsFromDb(Guid p) 
    { 
     SqlCommand com = new SqlCommand(); 
     com.Connection = conn; 

     com.CommandText = "spSelectProspectUsingLinkParameter"; 
     com.CommandType = CommandType.StoredProcedure; 
     com.Parameters.AddWithValue("@linkparam", p); 
     conn.Open(); 
     SqlDataReader rdr = com.ExecuteReader(); 
     ... 
     etc 
    } 

Cela signifie que l'objet peut encore exister comme un objet discret et peut être utilisé dans d'autres endroits et SqlDataReader ne doit pas être passé autour, que je l'ai trouvé n'aime pas beaucoup. Incidemment, pendant que j'explorais ce problème moi-même, j'ai trouvé qu'il y avait de bonnes chances que je frappe des valeurs nulles étranges dans la traduction des données des types de données dans la base de données vers les types de données .Net. En utilisant quelque chose comme le code suivant, j'ai réussi à éviter les types de données DBNull et à utiliser les noms de colonnes dans la base de données.

if (!rdr.IsDBNull(rdr.GetOrdinal("firstname"))) 
{ 
    Firstname = rdr.GetString(rdr.GetOrdinal("firstname")); 
} 
Questions connexes