it-roy-ru.com

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

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

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

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

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

или же

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

Это objects, поэтому вам нужно либо разыграть их, либо .ToString().

93
Mark Avenius

Поместите имя столбца начало, возвращаемое из базы данных, где "ColumnName". Если это строка, вы можете использовать .ToString(). Если это другой тип, вам нужно конвертировать его с помощью 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();
}

это будет работать

24
Mohini Mhetre

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

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

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

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, результат будет нулевым.

12
Tiele Declercq

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

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

Проще говоря, если ваш запрос возвращает column_name и содержит строку:

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

Я знаю, что это довольно старое, но если вы читаете содержимое 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;
        }
4
Ali Umair

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

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

        return o.ToString();
    }

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

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

Я бы поспорил против, используя SqlDataReader здесь; В ADO.NET есть lots случаев и осложнений Edge, и, по моему опыту, написанный вручную код 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> для материализации целых строк в объекты.

3
Marc Gravell

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

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