我正在开发一个用 VB.NET 构建的 Windows 桌面应用程序,该应用程序与基于 Web 的数据库 (Microsoft SQL Server 2012) 交互。它在需要时连接到数据库并在本地执行一些计算。
现在,有一个从该 Windows 应用程序执行存储过程的新要求。我需要知道当我调用 SqlCommand.ExecuteNonQuery 时,SqlCommand 是立即释放还是等到存储过程完成所有工作?
我现在无法测试,因为存储过程尚未设计,并且至少需要 2 分钟才能完成。
我在与 UI 不同的线程上运行 SqlCommand.ExecuteNonQuery。
担心 SqlCommand 是否没有立即释放:
是的,ExecuteNonQuery 将等待 SP 完成或出现错误。
如果您从另一个线程运行 ExecuteNonQuery,则只有该线程在等待。其他线程则不然,因此用户可以关闭应用程序。如果您在关闭之前清理线程(您应该这样做),它将向 SP 发送取消消息。 (这并不意味着它实际上会取消。如果它几乎完成,它可能会完成。)然后会发生什么取决于您的 SQL 开发人员。如果他们在事务内运行 SP,他们应该回滚更改并返回错误。如果没有,请聘请新的 SQL 开发人员。
方法 ExecuteNonQuery 等待存储过程完成。返回将是一个整数,其中包含受影响的行数。