2010-03-03 3 views
3

je besoin d'aide de la syntaxe avec la logique de code suivant:Récupération des enregistrements d'une base de données en C# 2008

J'ai un bloc de code qui se adresse e-mail de la base de données. Les adresses e-mail doivent être affectés à une chaîne strEmailAddress variable avec un seperation virgule

Mon code est:

SqlConnection conn = new SqlConnection(strConn); 
string sqlEmailAddress = "usp_Get_Email_Address"; 
SqlCommand cmdEmailAddr = new SqlCommand(sqlEmailAddress, conn); 
cmdEmailAddr.CommandType = CommandType.StoredProcedure; 
con.Open(); 
SqlDataReader sqlDREmailAddr = cmdEmailAddr.ExecuteReader(); 

Comment puis-je boucle à travers les dossiers et stocker les résultats dans strEmailAddress séparés par une virgule?

Répondre

3

Utilisez la méthode SqlDataReader.Read:

while (sqlDREmailAddr.Read()) 
{ 
... 
// Assumes only one column is returned with the email address 
strEmailAddress = sqlDREmailAddr.GetString(0); 
} 
+0

while (sqlDREmailAddr.read()) {strEmailAddress = ?????} – user279521

+0

Je ne sais pas ce que votre procédure stockée retourne. Comment cela se voit-il dans le datarecord? – Oded

+0

renvoie une chaîne; il peut y avoir plus d'un enregistrement retourné; – user279521

5
while (sqlDREmailAddr.Read()) 
{ 
    //...process each row here 
} 

Je voudrais aussi envelopper le lecteur dans un communiqué using pour vous assurer qu'il est correctement fermé:

using (SqlDataReader sqlDREmailAddr = cmdEmailAddr.ExecuteReader()) 
{ 
} 

Selon ce que les colonnes de votre ensemble de données porte le nom, la lecture des valeurs de chaque enregistrement regardera quelque chose comme ça (mise à jour: maintenant avec toutes les adresses fusionnées):

var emailAddress = new StringBuilder(); 
var emailAddressOrdinal = sqlDREmailAddr.GetOrdinal("EmailAddress"); 
while (sqlDREmailAddr.Read()) 
{ 
    if (emailAddress.Length > 0) 
     emailAddress.Append(','); 
    emailAddress.Append(sqlDREmailAddr.GetString(emailAddressOrdinal)); 
} 
+4

+1 pour l'emballage du lecteur en cours d'utilisation. – Oded

+0

while (sqlDREmailAddr.read()) { strEmailAddress = ????? } – user279521

+0

@ user279521: ajout de code pour la concaténation des adresses –

1
while (sqlDREmailAddr.Read()) 
    { 
    // handle row here 
    } 
+1

Le test de HasRows est plutôt superflu puisque le premier appel à 'Read()' retournera false s'il n'y a pas de lignes. –

+0

Je le pensais aussi, j'avais à l'origine ma réponse sans ... mais sur l'exemple de MSDN, ils ont fait les deux. Alors j'ai mis les deux. http://msdn.microsoft.com/en-us/library/haa3afyz%28VS.71%29.aspx – Gabe

1

C'est ce que vous cherchez ....

 
using (SqlConnection conn = new SqlConnection(strConn)){ 
    string sqlEmailAddress = "usp_Get_Email_Address"; 

    using (SqlCommand cmdEmailAddr = new SqlCommand(sqlEmailAddress, conn)){ 
     cmdEmailAddr.CommandType = CommandType.StoredProcedure; 

     conn.Open(); // Typo Glitch! 

     using (SqlDataReader sqlDREmailAddr = cmdEmailAddr.ExecuteReader()){ 

      while(sqlDREmailAddr.Read()){ 

       if (!sqlDREmailAddr.IsDBNull(sqlDREmailAddr.GetOrdinal("emailAddr"))){ 

       // HANDLE THE DB NULL... 

       }else{ 

       strEmailAddress = sqlDREmailAddr.GetSqlString(sqlDREmailAddr.GetOrdinal("emailAddr")); 

       // Do something with strEmailAddr... 

       } 
      } 
     } 
    } 

} 

Avis:

  • Une faute de frappe glitch sur la variable conn.
  • Une vérification est effectuée pour s'assurer que la valeur de la base de données retournée n'est pas NULL
  • Un appel est fait à GetOrdinal pour retourner la colonne en fonction de la valeur de chaîne emailAddr qui correspond à la colonne de la requête SQL Sélectionnez ... qui est un type int) comme paramètre pour GetSqlString ..

Modifier: Merci à John Saunders pour souligner un bêtisier!

Edit # 2: Merci à Peter Lillevold pour remarquer une faute d'orthographe ...

Hope this helps, Meilleures salutations, Tom.

+0

Que diriez-vous d'utiliser des blocs? –

+1

Déplacez vos 'GetOrdinal's hors de la boucle. Et 'Read' est avec le capital R :) –

+0

@Peter Lillevold: soupir ... souhaite qu'il y avait un vérificateur d'orthographe intelligent pour repérer celui-là ... ouais ... bon attrape là .... :) gentil un + 1 pour ton commentaire! – t0mm13b

Questions connexes