Чтение данных из SqlDataReader

У меня есть база данных SQL Server 2008, и я работаю над ней в бэкэнд. Я работаю над asp.net/С#

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

Я знаю, что у читателя есть ценности. Моя команда SQL состоит в том, чтобы выбрать только 1 столбец из таблицы. Столбец содержит только строки. Я хочу читать строки (строки) в читателе один за другим. Как это сделать?

Ответ 1

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

Ответ 2

string col1Value = rdr["ColumnOneName"].ToString();

или же

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

Это object s, поэтому вам нужно либо привести их в действие, либо .ToString().

Ответ 3

Поместите имя начального столбца из базы данных, где "ColumnName". Если это строка, вы можете использовать .ToString(). Если это другой тип, вам нужно его преобразовать с помощью System.Convert.

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

Ответ 4

while(rdr.Read())
{
   string col=rdr["colName"].ToString();
}

it wil work

Ответ 5

Для одного результата:

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

Для нескольких результатов:

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

Ответ 6

Мысль поделиться моим вспомогательным методом для тех, кто может его использовать:

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

Использование:

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

Вспомогательный метод использует любое значение, которое вам нравится, если оно не может быть выполнено, или значение базы данных равно NULL, результат будет равен нулю.

Ответ 7

Собственно, я сам понял, что могу это сделать:

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

Ответ 8

В простейших терминах, если ваш запрос возвращает имя_столбца и содержит строку:

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

Ответ 9

Я знаю, что это довольно старый, но если вы читаете содержимое SqlDataReader в классе, то это будет очень удобно. имена столбцов читателя и класса должны быть одинаковыми

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

Ответ 10

У меня есть вспомогательная функция вроде:

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

        return o.ToString();
    }

то я использую его для извлечения строки:

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

Ответ 11

Я бы поспорил против использования SqlDataReader здесь; ADO.NET имеет множество крайних случаев и сложностей, и, по моему опыту, большинство написанного вручную кода ADO.NET нарушается по крайней мере одним способом (обычно тонким и контекстным).

Инструменты существуют, чтобы избежать этого. Например, в случае здесь вы хотите прочитать столбец строк. Dapper делает это совершенно безболезненным:

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

Dapper здесь имеет дело со всей параметризацией, выполнением и обработкой строк - и множеством других шероховатых деталей ADO.NET. <string> можно заменить на <SomeType> для материализации целых строк в объекты.

Ответ 12

Я обычно читаю данные читателем данных таким образом. просто добавил небольшой пример.

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

Ответ 13

Что если в имени столбца есть квадратные скобки из-за наличия пробела?

sClientCode = stDataReader.Item("[Код клиента]"). ToString()

[Код клиента] Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.IndexOutOfRangeException: [код клиента]

Ошибка источника:

Во время выполнения текущего веб-запроса было сгенерировано необработанное исключение. Информация о происхождении и местонахождении исключения может быть идентифицирована с помощью приведенной ниже трассировки стека исключений.