Je souhaite stocker ce qui est renvoyé par une requête de base de données dans une liste de chaînes. J'ai ce code:
List<String> slDistinctUncommonWords = new List<string>();
. . .
slDistinctUncommonWords = GetDistinctWordsFromDB();
. . .
private List<String> GetDistinctWordsFromDB()
{
List<String> slDistinctWords = new List<string>();
try
{
string sQuery = "SELECT DISTINCT UncommonWord " +
"FROM WORDSTATS " +
"ORDER BY UncommonWord";
SqlConnection sqlConnection = new SqlConnection(connection);
SqlCommand cmd = new SqlCommand(sQuery, sqlConnection);
sqlConnection.Open();
slDistinctWords = (List<String>)cmd.ExecuteScalar();
sqlConnection.Close();
return slDistinctWords;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return null;
}
}
Le "slDistinctUncommonWords = GetDistinctWordsFromDB ();" échoue, cependant, avec " Impossible de convertir un objet de type 'System.String' en type 'System.Collections.Generic.List'1 [System.String]' ".
5 Réponses :
Mettre dans une table de données
DataTable dt = new DataTable();
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
adapter.Fill(dt);
List<string> slDistinctWords = dt.AsEnumerable().Select(x => x.Field<string>(0)).Distinct().ToList();
Vous pouvez utiliser ExecuteReader au lieu de ExecuteScalar , comme le code suivant:
using(SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
slDistinctWords.Add(reader["UncommonWord"].ToString());
}
}
I j'espère que vous trouverez cela utile.
Si vous utilisez Microsoft SQL Server, essayez de remplacer votre instruction de requête SQL par ceci:
string sQuery = "SELECT DISTINCT CAST(UncommonWord AS VARCHAR(32)) + ',' " +
"FROM WORDSTATS " +
"ORDER BY UncommonWord FOR XML PATH('')";
La question demande une List, pas une string . Au minimum, si vous êtes enclin à adopter cette approche, vous devez Fractionner () les résultats par , et les convertir en liste.
Un SqlDataReader peut être traité comme une collection d'objets IDataRecord. Donc
var col = new List<String>();
using (var rdr = cmd.ExecuteReader())
{
col = rdr.Cast<IDataRecord>().Select(r => r.GetString(0)).ToList();
}
Cela fonctionne:
private List<String> GetDistinctWordsFromDB()
{
List<String> slDistinctWords = new List<string>();
try
{
string sQuery = "SELECT DISTINCT UncommonWord " +
"FROM WORDSTATS " +
"ORDER BY UncommonWord";
SqlConnection sqlConnection = new SqlConnection(connection);
SqlCommand cmd = new SqlCommand(sQuery, sqlConnection);
SqlDataReader reader;
sqlConnection.Open();
reader = cmd.ExecuteReader();
while (reader.Read())
{
slDistinctWords.Add(reader.GetString(0));
}
reader.Close();
sqlConnection.Close();
return slDistinctWords;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return null;
}
}
ExecuteScalar renvoie uniquement la première valeur de colonne de la première ligne du premier jeu de résultats. Vous souhaitez peut-être utiliser ExecuteReader