在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)成功完成的结果”。而不是一个没有行的潜在表?
答案 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排除隐藏字段。