繁体   English   中英

从SQL Server表的一行中获取所有值时,如果不存在任何数据,则尝试进行无效的读取数据

[英]Invalid attempt to read data when no data is present when getting all values from a row in a SQL Server table

我有一种方法可以在给定SQL查询的情况下返回所有列的var fieldCount = reader.GetValues(values) ,但是当行var fieldCount = reader.GetValues(values)Invalid attempt to read data when no data is present ,我看到Invalid attempt to read data when no data is presentvalues它有88项目。

internal List<string> GetColumnValuesForRow(SqlDataReader reader)
{
    var listOfItems = new List<string>();
    // Given a SqlDataReader, use the GetValues 
    // method to retrieve a full row of data. 
    // Test the GetValues method, passing in an array large 
    // enough for all the columns.
    var values = new Object[reader.FieldCount];
    var fieldCount = reader.GetValues(values);

    Console.WriteLine("Retrieved {0} columns.",
    fieldCount);
    for (var i = 0; i < fieldCount; i++)
    {
        Console.WriteLine(values[i]);
        listOfItems.Add(values[i].ToString());
    }

    return listOfItems;
}

我正在从此方法调用上述方法。

internal List<string> SqlQueryForRow(string query)
{
    var conn = new SqlConnection(ConnectionString);
    var cmd = new SqlCommand(query, conn);
    SqlDataReader reader;

    cmd.CommandText = query;
    cmd.CommandType = CommandType.Text;
    cmd.Connection = conn;

    conn.Open();

    reader = cmd.ExecuteReader();
    // Data is accessible through the DataReader object here.
    // TODO add handling for more than one row; i.e. just take the first row
    var rowOfItems = GetColumnValuesForRow(reader);

    conn.Close();

    return rowOfItems;
}

为什么当我获取values它显示88项目,但是当我调用reader.GetValues(values) Invalid attempt to read data when no data is present抛出Invalid attempt to read data when no data is present

我测试的查询是SQL Server Management Studio,它只返回一条记录。

当从SQL数据库访问和读取行时,以下代码对我而言工作正常。 正如DJ KRAZE提到的,请始终先检查是否有任何行。

if (reader.HasRows)
{
     while (reader.Read())
     {
          // Read all column data from row here, one row at a time
     }
}

这个工作...

    internal List<string> SqlQueryForRow(string query)
    {
        var conn = new SqlConnection(ConnectionString);
        var cmd = new SqlCommand(query, conn)
        {
            CommandText = query,
            CommandType = CommandType.Text,
            Connection = conn
        };

        conn.Open();

        var reader = cmd.ExecuteReader();
        // Data is accessible through the DataReader object here.
        // TODO add handling for more than one row; i.e. just take the first row
        var rowOfItems = new List<string>();
        if (reader.HasRows)
        {
            while (reader.Read())
            {
                rowOfItems = GetColumnValuesForRow(reader);
            }
        }

        conn.Close();

        return rowOfItems;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM