.net 如果对引用不返回行集的存储过程的`SqlCommand`调用`ExecuteReader`方法,会发生什么?

.net 如果对引用不返回行集的存储过程的`SqlCommand`调用`ExecuteReader`方法,会发生什么?,.net,ado.net,sqldatareader,.net,Ado.net,Sqldatareader,我有一个SqlCommand,它可能返回零个或多个行集。如果碰巧SqlCommand将返回零行集*并且我调用其ExecuteReader方法,会发生什么情况?我是得到了无法读取的SqlDataReader,还是得到了异常 以防万一:零行集与一个包含零行的行集不同。SqlDataReader.Read()以及HasRows将返回false: var reader = command.ExecuteReader(); if (reader.HasRows) // false { while

我有一个
SqlCommand
,它可能返回零个或多个行集。如果碰巧
SqlCommand
将返回零行集*并且我调用其
ExecuteReader
方法,会发生什么情况?我是得到了无法读取的
SqlDataReader
,还是得到了异常

以防万一:零行集与一个包含零行的行集不同。

SqlDataReader.Read()
以及
HasRows
将返回
false

var reader = command.ExecuteReader();
if (reader.HasRows) // false
{
    while (reader.Read()) // false
    {
        // will never reach
    }
}
SqlDataReader.Read()
以及
HasRows
将返回
false

var reader = command.ExecuteReader();
if (reader.HasRows) // false
{
    while (reader.Read()) // false
    {
        // will never reach
    }
}

您仍应接收SqlDataReader对象。当您尝试时:

using (SqlCommand command = new SqlCommand( /* params */))
using (SqlDataReader reader = command.ExecuteReader())
{
    if (reader.HasRows)    // check to see if we have any rows
    {
        while (reader.Read())
        {
            // process
        }
    }
}

。。。由于
Read()
将返回
false

您仍然应该收到一个SqlDataReader对象,因此您将只是“失败”。当您尝试时:

using (SqlCommand command = new SqlCommand( /* params */))
using (SqlDataReader reader = command.ExecuteReader())
{
    if (reader.HasRows)    // check to see if we have any rows
    {
        while (reader.Read())
        {
            // process
        }
    }
}


。。。当
Read()
将返回
false

您的
读取器时,您将只是“失败”。如果没有行集,FieldCount
将为零。如果使用数据集而不是读卡器,则无行集的数据集将为空。

您的
读卡器。无行集的FieldCount
将为零。如果使用数据集而不是读卡器,则无行集的数据集将为空。

最好的方法是尝试yourself@abatischev:不太好。最好的方法是,如果文档不糟糕,并且实际解释了在这些角落案例中发生的情况。这不是一个角落/对冲案例。如果重新运行0条记录(或行集;)并不常见,那么SqlDataReader将返回
null
@IAbstract:我从来没有说过一个行集包含零条记录。我说的是零行集。最好的办法是尝试yourself@abatischev:不太好。最好的方法是,如果文档不糟糕,并且实际解释了在这些角落案例中发生的情况。这不是一个角落/对冲案例。如果重新运行0条记录(或行集;)并不常见,那么SqlDataReader将返回
null
@IAbstract:我从来没有说过一个行集包含零条记录。我说的是零行。@abatischev:所以。。。我如何判断存储过程返回的是零行集,还是一个或多个空行集?@Eduardo:在空行集下,您是否理解一个字段为空的行?或者什么?@abatischev:
如果0=1选择1
生成零行集。@abatischev:相反,
select 1其中0=1
生成一个空行集。@abatischev:当我在SQL Server Management Studio上测试
select null
时,它返回了一个包含一行的行集。@abatischev:所以。。。我如何判断存储过程返回的是零行集,还是一个或多个空行集?@Eduardo:在空行集下,您是否理解一个字段为空的行?或者什么?@abatischev:
如果0=1选择1
生成零行集。@abatischev:相反,
select 1其中0=1
生成一个空行集。@abatischev:当我在SQL Server Management Studio上测试
select null
时,它返回一个包含一行的行集。