首页 文章

从SqlDataReader读取数据

提问于
浏览
139

我有一个SQL Server 2008数据库,我正在后端处理它 . 我在asp.net/C#上工作

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

我知道读者有 Value 观 . 我的SQL命令是从表中只选择1列 . 该列仅包含字符串 . 我想逐一阅读阅读器中的字符串(行) . 我该怎么做呢?

12 回答

  • 12
    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);
        }
    }
    
  • 3

    "ColumnName" 所在的数据库中返回的列的名称设置为 . 如果是字符串,则可以使用 .ToString() . 如果是另一种类型,则需要使用 System.Convert 进行转换 .

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

    我通常以这种方式通过数据读取器读取数据 . 刚刚添加了一个小例子 .

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

    想为那些可以使用它的人分享我的帮助方法:

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

    helper方法转换为您喜欢的任何值,如果它无法转换或数据库值为NULL,则结果为null .

  • 4

    实际上,我自己想通了我能做到这一点:

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

    我知道这有点旧,但如果你正在将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;
            }
    
  • 24

    我想反对在这里使用 SqlDataReader ; ADO.NET有许多边缘情况和复杂性,根据我的经验,大多数手动编写的ADO.NET代码至少在一种方式中被破坏(通常是微妙的和上下文的) .

    存在避免这种情况的工具 . 例如,在这种情况下,您想要读取一列字符串 . Dapper使这完全无痛:

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

    这里的Dapper正在处理所有参数化,执行和行处理 - 以及ADO.NET的许多其他蹩脚细节 . 可以使用 <SomeType> 替换 <string> 以将整行实现为对象 .

  • 14

    简单来说,如果您的查询返回column_name并且它包含一个字符串:

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

    我有一个帮助函数,如:

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

    然后我用它来提取字符串:

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

    对于单个结果:

    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());
    }
    
  • 140
    string col1Value = rdr["ColumnOneName"].ToString();
    

    要么

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

    这些是 object s,因此您需要投射它们或 .ToString() .

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

    它会工作

相关问题