在C#ADO.NET中,如何判断sproc是否返回0行而sproc没有命令在TSQL上运行?

时间:2011-06-07 15:24:53

标签: c# tsql ado.net sqldatareader

在C#ADO.NET中,如何判断sproc是否返回0行而sproc没有命令在TSQL上运行?

让我完整地说出来。在TSQL中我(当我在SSMS中打开它时)

ALTER PROC mySproc 
  @myvar VARCHAR(10)
AS

/* commented out on dev system - uncomment on production */
/* guess what didn't happen */
/* careful readers will note that we _normally_ 
   throw an exception when we do this. this sproc was missing said exception. */

在SSMS mySproc 'value'中运行时,这表示“命令已成功完成”。在更好的情况下(也就是说没有返回数据但是sproc的主体实际上正在运行),它会返回看起来像表但没有行的内容。

并在C#中:

using( SqlDataReader reader = cmd.ExecuteReader() ){
  //reader.HasRows == false
}

所以,这就是我遇到的,没有使用“sql reflection”(ergo阅读数据库中的实际脚本)而没有使用ORM(因为那时我会知道我发送了正确的命令,但是我们有我们使用sprocs的原因当然是......

我怎么知道我得到了“Command(s)成功完成的结果”。而不是一个没有行的潜在表?

2 个答案:

答案 0 :(得分:1)

我建议审核SQL Server并打败实际创建没有主体的SPROC的开发人员。我知道没有办法从读者那里确定SQL Server中的愚蠢,而不是在没有行的情况下实际发出审计(运行类似sp_helptext并确定是否有正文?)。很难防止邋iness。遗憾!

答案 1 :(得分:1)

我最初把它放在评论中,但它更适合作为答案

您可以使用阅读器上的FieldCount属性来确定列数。例如:

using( SqlDataReader reader = cmd.ExecuteReader() )
{
    if (reader.FieldCount > 0) 
    {
       // there are columns
    } 
    else 
    {
       // there are no columns, so stored proc returning no results set
    }
}

FieldCount上的the MSDN page

  

执行一个查询,就其本质而言,不返回行(例如DELETE查询),将FieldCount设置为0.但是。这不应该与返回0行的查询混淆(例如SELECT * FROM表WHERE 1 = 2),在这种情况下,FieldCount返回表中的列数,包括隐藏字段。使用VisibleFieldCount排除隐藏字段。