如何对多个查询执行ExecuteScalarAsync并操作数据

本文关键字:ExecuteScalarAsync 操作 操作数 数据 执行 查询 | 更新日期: 2023-09-27 18:26:16

我使用ADO.NET,在我的一个方法中,如果客户使用任何公司产品,我需要返回布尔值。出于这个原因,我需要执行几个查询,因为不同的产品与客户端有不同的联合表,所以我最终得到的是:

SqlCommand firstProduct= new SqlCommand(firstQuery, connection);
                firstProduct.CommandTimeout = 300;
IAsyncResult numberOfUsedProducts = firstProduct.ExecuteScalarAsync();
//second product
SqlCommand secondProduct= new SqlCommand(secondQuery, connection);
                secondProduct.CommandTimeout = 300;
                IAsyncResult numberOfUsedProducts1 = secondProduct.ExecuteScalarAsync();
//third rpoduct
SqlCommand thirdProduct = new SqlCommand(thirdQuery, connection);
                thirdProduct.CommandTimeout = 300;
                IAsyncResult numberOfUsedProducts2 = thirdProduct .ExecuteScalarAsync();

基本上,我想知道的是如何继续并收集每个查询的结果,以便执行一些额外的逻辑?

从我的调查中,我发现我可以使用这样的东西:

WaitHandle waitHandle1 = firstProduct.AsyncWaitHandle;
WaitHandle waitHandle2 = secondProduct.AsyncWaitHandle;
WaitHandle waitHandle3 = thirdProduct.AsyncWaitHandle;
System.Threading.WaitHandle[] waitHandles = {
           waitHandle1, waitHandle2, waitHandle3
      };

然后

index = WaitHandle.WaitAny(waitHandles, 
                    60000, false);
switch (index)
               {
..

但老实说,我不确定上面的代码在做什么。我想要的是处理两种情况-收集所有三个查询的结果并进行检查。如果可能的话,因为从我读到的内容来看,任何查询都会返回不同于零的结果,以停止进一步的执行,因为有时我只关心客户端是否在使用任何产品,而不关心每个产品有多少。

如何对多个查询执行ExecuteScalarAsync并操作数据

您对IAsyncResult的使用已经过时。ExecuteScalarAsync返回一个Task(它实现IAsyncResult,但隐式地实现,因此没有人使用它)。

下一个问题是您同时使用同一个连接,这是不允许的。您必须使用多个连接,或者使用MARS,并且在线程处理时要非常小心。

你的代码可能应该是这样的:

var results = await Task.WhenAll(firstProduct, ...);

您也可以为此代码添加超时。

如果希望在任何查询返回后立即停止所有其他查询,请使用Task.WhenAny并使用CancellationToken基础结构取消其他未完成的查询。

相关文章:
  • 没有找到相关文章