如何对多个查询执行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)
{
..
但老实说,我不确定上面的代码在做什么。我想要的是处理两种情况-收集所有三个查询的结果并进行检查。如果可能的话,因为从我读到的内容来看,任何查询都会返回不同于零的结果,以停止进一步的执行,因为有时我只关心客户端是否在使用任何产品,而不关心每个产品有多少。
您对IAsyncResult
的使用已经过时。ExecuteScalarAsync
返回一个Task
(它实现IAsyncResult
,但隐式地实现,因此没有人使用它)。
下一个问题是您同时使用同一个连接,这是不允许的。您必须使用多个连接,或者使用MARS,并且在线程处理时要非常小心。
你的代码可能应该是这样的:
var results = await Task.WhenAll(firstProduct, ...);
您也可以为此代码添加超时。
如果希望在任何查询返回后立即停止所有其他查询,请使用Task.WhenAny
并使用CancellationToken
基础结构取消其他未完成的查询。