web-dev-qa-db-fra.com

Lire les données de SqlDataReader

J'ai une base de données SQL Server 2008 et j'y travaille dans le backend. Je travaille sur asp.net/C#

SqlDataReader rdr = cmd.ExecuteReader();  
while (rdr.Read())  
{              
   //how do I read strings here????  
}  

Je sais que le lecteur a des valeurs. Ma commande SQL consiste à sélectionner une seule colonne dans une table. La colonne contient des chaînes SEULEMENT. Je veux lire les chaînes (lignes) du lecteur une à une. Comment puis-je faire cela?

140
zack
using(SqlDataReader rdr = cmd.ExecuteReader())
{
    while (rdr.Read())
    {
        var myString = rdr.GetString(0); //The 0 stands for "the 0'th column", so the first column of the result.
        // Do somthing with this rows string, for example to put them in to a list
        listDeclaredElsewhere.Add(myString);
    }
}
140
Scott Chamberlain
string col1Value = rdr["ColumnOneName"].ToString();

ou

string col1Value = rdr[0].ToString();

Ce sont objects, vous devez donc les lancer ou .ToString().

93
Mark Avenius

Placez le nom de la colonne begin renvoyée de la base de données où "ColumnName" est. Si c'est une chaîne, vous pouvez utiliser .ToString(). S'il s'agit d'un autre type, vous devez le convertir à l'aide de System.Convert.

SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
    string column = rdr["ColumnName"].ToString();
    int columnValue = Convert.ToInt32(rdr["ColumnName"]);
}
33
Martin
while(rdr.Read())
{
   string col=rdr["colName"].ToString();
}

ça va marcher

24
Mohini Mhetre

Pour un seul résultat:

if (reader.Read())
{
    Response.Write(reader[0].ToString());
    Response.Write(reader[1].ToString());
}

Pour des résultats multiples:

while (reader.Read())
{
    Response.Write(reader[0].ToString());
    Response.Write(reader[1].ToString());
}
15
Piseth Sok

Pensé pour partager ma méthode d'assistance pour ceux qui peuvent l'utiliser:

public static class Sql
{
    public static T Read<T>(DbDataReader DataReader, string FieldName)
    {
        int FieldIndex;
        try { FieldIndex = DataReader.GetOrdinal(FieldName); }
        catch { return default(T); }

        if (DataReader.IsDBNull(FieldIndex))
        {
            return default(T);
        }
        else
        {
            object readData = DataReader.GetValue(FieldIndex);
            if (readData is T)
            {
                return (T)readData;
            }
            else
            {
                try
                {
                    return (T)Convert.ChangeType(readData, typeof(T));
                }
                catch (InvalidCastException)
                {
                    return default(T);
                }
            }
        }
    }
}

Usage:

cmd.CommandText = @"SELECT DISTINCT [SoftwareCode00], [MachineID] 
                    FROM [CM_S01].[dbo].[INSTALLED_SOFTWARE_DATA]";
using (SqlDataReader data = cmd.ExecuteReader())
{
    while (data.Read())
    {
        usedBy.Add(
            Sql.Read<String>(data, "SoftwareCode00"), 
            Sql.Read<Int32>(data, "MachineID"));
    }
}

La méthode d'assistance attribue la valeur souhaitée, si elle ne peut pas être convertie ou si la valeur de la base de données est NULL, le résultat sera null.

12
Tiele Declercq

En fait, je me suis dit que je pouvais faire ceci:

while (rdr.read())
{  
  string str = rdr.GetValue().ToString().Trim();  
}
8
zack

En termes simples, si votre requête retourne nom_colonne et qu'elle contient une chaîne:

while (rdr.Read())
{
    string yourString = rdr.getString("column_name")
}
6
Dekker500

Je sais que c'est un peu vieux, mais si vous lisez le contenu d'un SqlDataReader dans une classe, alors ce sera très pratique. les noms de colonne du lecteur et de la classe doivent être identiques

public static List<T> Fill<T>(this SqlDataReader reader) where T : new()
        {
            List<T> res = new List<T>();
            while (reader.Read())
            {
                T t = new T();
                for (int inc = 0; inc < reader.FieldCount; inc++)
                {
                    Type type = t.GetType();
                    string name = reader.GetName(inc);
                    PropertyInfo prop = type.GetProperty(name);
                    if (prop != null)
                    {
                        if (name == prop.Name)
                        {
                            var value = reader.GetValue(inc);
                            if (value != DBNull.Value)
                            { 
                                prop.SetValue(t, Convert.ChangeType(value, prop.PropertyType), null);
                            }
                            //prop.SetValue(t, value, null);

                        }
                    }
                }
                res.Add(t);
            }
            reader.Close();

            return res;
        }
4
Ali Umair

J'ai une fonction d'assistance comme:

  public static string GetString(object o)
    {
        if (o == DBNull.Value)
            return "";

        return o.ToString();
    }

alors je l'utilise pour extraire la chaîne:

 tbUserName.Text = GetString(reader["UserName"]);
3
JBrooks

Je dirais que contre en utilisant SqlDataReader ici; ADO.NET a beaucoup de cas Edge et de complications, et selon mon expérience, le code ADO.NET écrit manuellement est divisé en au moins d'une manière (généralement subtile et contextuelle).

Des outils existent pour éviter cela. Par exemple, dans le cas présent, vous voulez lire une colonne de chaînes. Dapper rend cela complètement indolore:

var region = ... // some filter
var vals = connection.Query<string>(
    "select Name from Table where Region=@region", // query
    new { region } // parameters
).AsList();

Dapper s’occupe ici de tout le paramétrage, de l’exécution et du traitement des lignes - ainsi que de nombreux autres détails déplaisants d’ADO.NET. Le <string> peut être remplacé par <SomeType> pour matérialiser des lignes entières dans des objets.

3
Marc Gravell

J'ai l'habitude de lire les données par lecteur de données de cette façon. vient d'ajouter un petit exemple.

string connectionString = "Data Source=DESKTOP-2EV7CF4;Initial Catalog=TestDB;User ID=sa;Password=tintin11#";
string queryString = "Select * from EMP";

using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand(queryString, connection))
            {
                connection.Open();

                using (SqlDataReader reader = command.ExecuteReader())
                {
                    if (reader.HasRows)
                    {
                        while (reader.Read())
                        {
                            Console.WriteLine(String.Format("{0}, {1}", reader[0], reader[1]));
                        }
                    }
                    reader.Close();
                }
            }
0
Mist