在C#ADO.NET中,如何判断存储过程是否返回0行,而存储过程是否没有可在TSQL上运行的命令
本文关键字:是否 存储过程 TSQL 命令 运行 0行 返回 何判断 判断 C#ADO NET | 更新日期: 2023-09-27 17:58:30
在C#ADO.NET中,如何判断存储过程是否返回0行,以及存储过程是否没有可在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'
中运行时,会显示"命令已成功完成"。在更好的情况下(即没有返回任何数据,但存储过程的主体实际正在运行),它会返回看起来像表但没有行的内容。
在C#中:
using( SqlDataReader reader = cmd.ExecuteReader() ){
//reader.HasRows == false
}
所以,这就是我遇到的情况,没有使用"sql反射"(遍历数据库中的实际脚本),也没有使用ORM(因为这样我就知道我发送了正确的命令,但我们当然有使用sprocs的理由)。。。
我如何判断我得到了"命令成功完成"的结果,而不是一个没有行的潜在表?
我最初把它放在注释中,但它更适合作为答案
可以使用读卡器上的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
上的MSDN页面
执行本质上不返回行的查询(如DELETE查询)会将FieldCount设置为0。然而这不应该与返回0行的查询混淆(例如SELECT*FROM表WHERE 1=2),在这种情况下,FieldCount返回表中的列数,包括隐藏字段。使用VisibleFieldCount可以排除隐藏字段。
我建议审计SQL Server,并击败那些实际上创建了没有实体的SPROC的开发人员。我知道除了在没有行的情况下实际发出审计(运行sp_helptext之类的程序并确定是否有正文?)之外,没有其他方法可以从读取器中确定SQL Server中的愚蠢。很难避免马虎。很抱歉