DataTable / DataHelper 行通过存储过程不为空

Posted

技术标签:

【中文标题】DataTable / DataHelper 行通过存储过程不为空【英文标题】:DataTable / DataHelper rows not empty via stored procedure 【发布时间】:2022-01-16 16:09:47 【问题描述】:

只是有点卡住了,我似乎无法在 google 上找到我要找的东西。

由于某种原因,这个If 语句会产生行并继续运行代码,即使我知道存储过程不会产生任何结果。

我什么都试过了

(rp.Rows[0] != null) / (rp.Rows.Count > 0) 

&& 语句的组合没有运气。我的印象是所有这些语句只有在存储过程返回一行时才会触发?

对于我想在 Microsoft 文档中找到的确切内容,我也有点迷茫,感谢有人可能提供的回复和指导。

var rp = DataHelper.ExecuteStoredProcedure("[dbo].[Report]", newSqlParameter("@reportId", id));

if (rp.Rows.Any()) 

    // code

【问题讨论】:

当您调试时 - rp.Rows 是否包含任何内容?如果你运行int count = rp.Rows.Count - 你会得到什么价值?很难对外面的任何人说,因为 DataHelper 看起来不像一个标准的 .NET 类 - 所以我们不可能知道该类内部发生了什么以及它返回什么...... 它只是一个保存DataTable的类,我会看看我是否可以让程序在VS中运行 - 调试。很高兴确认我可能应该已经问过这个问题了。 【参考方案1】:

您不能在 DataRowCollection 上使用 .Any()(或任何其他 linq 扩展方法)而不先执行类似 .Cast<DataRow>() 的操作,因为 DataRowCollection 实现 IEnumerable,而不是 IEnumerable<T> LINQ 要求

if(dt.Rows.Cast<DataRow>().Any())

这对我来说没有意义:

(rp.Rows[0] != null) / (rp.Rows.Count > 0) 

你不能将一个布尔值除以另一个......


此外,如果没有行,这会崩溃:

rp.Rows[0] != null) 

这可以正常工作,并且会检测是否有行

rp.Rows.Count > 0

但与你所说的你想要的不一致:

当我知道存储过程不会产生任何结果时。

如果 sproc 不产生行并且代码仅在有行时运行,则代码不会运行

怎么样

if(rp.Rows.Count == 0)
  MessageBox.Show("no rows");
else
  foreach(DataRow r in rp.Rows)
    Console.WriteLine(r["some column name here"]);

【讨论】:

感谢您的回复,我犯了一个菜鸟错误,认为我的 SP 在实际设置为“END”而不是没有结果时没有产生任何行,我现在已经修复它并且它可以工作。干杯,你所有不同的方式现在在这种情况下都很有用。

以上是关于DataTable / DataHelper 行通过存储过程不为空的主要内容,如果未能解决你的问题,请参考以下文章

CS0103: 当前上下文中不存在名称“DataHelper”

填充树节点

2021-11-11 spring-boot报错没有主清单

获取datatable的值

DataTable的用法

Cucumber DataTable 错误 - io.cucumber.datatable.UndefinedDataTableTypeException:无法将 DataTable 转换为 cucu