为什么此查询返回的记录集的状态为 "closed"?

Why does the recordset returned by this query have a status of "closed"?

我 运行 以下 SQL 来自图形化编程语言 LabVIEW 的查询,使用它具有的内置数据库连接功能:

DECLARE @currentID int
SET @currentID = (SELECT MIN(ExperimentID) FROM Jobs_t WHERE JobStatus = 'ToRun');
UPDATE [dbo].[Jobs_t]
SET [JobStatus] = 'Pending'
WHERE ExperimentID = @currentID;
SELECT @currentID AS result

这是类似于 main() 的代码,是一种类 C 语言。第一个包含 "Connection Information" 线路的块打开一个 .udl 文件并创建一个 ADO.NET _Connection 引用,稍后用于调用查询方法。

这是第二块的内部,带有 "EXE" 的那个,里面有粉色电线。带有灰色边框的框的操作方式与 "switch" 语句非常相似。电线进入“?”这些盒子上的终端决定执行哪种情况。下拉白色矩形的黄色框是调用节点和属性节点;它们接受对对象的引用并允许您调用该对象的方法和 read/write 属性。您也可以在此处看到 _Recordset 对象。

这是要执行的下一个块,其图标显示为 "FETCH ALL"。我们看到在最左边执行的第一件事获取了记录集的一些属性,并且 returns 它们在 "struct" 中(进入框的粉红色线显示为 "state") .这是代码失败的地方。在之前的 VI(虚拟仪器)中打开的记录集的状态为 "closed",紫色变体(在 "Read all the data available" 下看到)返回为空。

其余代码完全无关紧要,因为它只是将接收到的变体转换为可用数据,并释放之前打开的记录集引用。

我的问题是,为什么查询记录集的状态会是"closed"?我意识到当查询 returns 没有行时,记录集是 "closed",但是在 SSMS returns 行中执行该查询。此外,执行 LabVIEW 代码会在查询中执行更新,所以我知道这也没有损坏。

如能就此问题提供任何指导,我们将不胜感激。随时提出有关 LabVIEW 中的问题;我可以毫不费力地为您提供您进行适当评估所需的尽可能多的信息。

首先,我建议你为此编写一个存储过程。其次,您的 drivers (ODBC) up to date? Thirdly, I think you might get better help by posting your question at forums.ni.com or lavag.org. Finally, maybe this topic 有没有对您有帮助的答案。

我在 LabVIEW subreddit 上发布了这个,事实证明数据库连接 VI 在批处理查询方面不是很好。我转而使用 OdbcConnection、OdbcCommand 和 OdbcDatareader 类 的方法和属性来实现我想要的。如果您有兴趣,请查看代码: