0
votes

Comment puis-je stocker les résultats de la requête SQL Server dans une liste de chaînes?

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]' ".


1 commentaires

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


5 Réponses :


1
votes

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();


0 commentaires

1
votes

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.


0 commentaires

0
votes

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('')";


1 commentaires

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.



1
votes

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();
}


0 commentaires

0
votes

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;
    }
}


0 commentaires