从SqlDataReader读取数据

zac*_*ack 148 c# asp.net sqldatareader sql-server-2008

我有一个SQL Server 2008数据库,我正在后端工作.我正在研究asp.net/C#

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

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

Sco*_*ain 146

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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ius 100

string col1Value = rdr["ColumnOneName"].ToString();
Run Code Online (Sandbox Code Playgroud)

要么

string col1Value = rdr[0].ToString();
Run Code Online (Sandbox Code Playgroud)

这些是objects,所以你需要投射它们或者.ToString().

  • []运算符返回一个对象,您需要将其转换为字符串. (3认同)
  • @BaltoStar很有意思; 我没有意识到这一点.但是,根据性能的不同(特别是与通过线路推送数据相比,基于您的应用程序),我通常会说,查看列名称的可读性和可维护性将胜过性能的任何微小改进.谢谢! (2认同)

Mar*_*tin 35

将从数据库返回的列的名称开头放在哪里"ColumnName".如果是字符串,则可以使用.ToString().如果是另一种类型,则需要使用它进行转换System.Convert.

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


Moh*_*tre 23

while(rdr.Read())
{
   string col=rdr["colName"].ToString();
}
Run Code Online (Sandbox Code Playgroud)

它会工作

  • `toString()`无效应该是`.ToString()`只是fyi (3认同)

Pis*_*Sok 16

对于单个结果:

if (reader.Read())
{
    Response.Write(reader[0].ToString());
    Response.Write(reader[1].ToString());
}
Run Code Online (Sandbox Code Playgroud)

对于多个结果:

while (reader.Read())
{
    Response.Write(reader[0].ToString());
    Response.Write(reader[1].ToString());
}
Run Code Online (Sandbox Code Playgroud)


Tie*_*rcq 14

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

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);
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

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"));
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 很好的一段代码,我修改它是一个扩展方法,并且工作得非常好`reader.GetColumn <int>("M_ID");` (2认同)

zac*_*ack 8

实际上,我自己弄清楚我能做到这一点:

while (rdr.read())
{  
  string str = rdr.GetValue().ToString().Trim();  
}
Run Code Online (Sandbox Code Playgroud)


Md *_*ron 8

你必须到read database column这里。您可以查看以下代码片段以进行实现:

string connectionString = ConfigurationManager.ConnectionStrings["NameOfYourSqlConnectionString"].ConnectionString;
using (var _connection = new SqlConnection(connectionString))
{
    _connection.Open();

    using (SqlCommand command = new SqlCommand("SELECT SomeColumnName FROM TableName", _connection))
    {

        SqlDataReader sqlDataReader = command.ExecuteReader();
        if (sqlDataReader.HasRows)
        {
            while (sqlDataReader.Read())
            {
                string YourFirstDataBaseTableColumn = sqlDataReader["SomeColumn"].ToString(); // Remember Type Casting is required here it has to be according to database column data type
                string YourSecondDataBaseTableColumn = sqlDataReader["SomeColumn"].ToString();
                string YourThridDataBaseTableColumn = sqlDataReader["SomeColumn"].ToString();

            }
        }
        sqlDataReader.Close();
    }
    _connection.Close();
}
Run Code Online (Sandbox Code Playgroud)


Ali*_*air 7

我知道这有点旧,但是如果您将 SqlDataReader 的内容读入一个类,那么这将非常方便。reader 和 class 的列名应该相同

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;
        }
Run Code Online (Sandbox Code Playgroud)


小智 6

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

while (rdr.Read())
{
    string yourString = rdr.getString("column_name")
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ell 6

反对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();
Run Code Online (Sandbox Code Playgroud)

Dapper在这里处理所有的参数化,执行和行处理-以及ADO.NET的许多其他低俗的细节。该<string>可以替换<SomeType>到整个行兑现成对象。