奇葩的Fill(dataSet)超时

Fill(DataSet)超时问题排查处理

 

bug复现:相同的一条语句 exec Proc_SelectTable
在数据库管理软件中执行速度很快,
但是在程序中执行很慢,

调用方法如下:

/// <summary>
/// 执行存储过程 返回DataSet
/// </summary>
/// <param name="conString">数据库连接串</param>
/// <param name="storedProcName">存储过程名</param>
/// <param name="parameters">存储过程参数</param>
/// <returns>DataSet</returns>
public static DataSet RunProcedureToDataSet(string conString, string storedProcName, IDataParameter[] parameters)
{
	using (SqlConnection connection = new SqlConnection(conString))
	{
		DataSet dataSet = new DataSet();
		connection.Open();
		SqlDataAdapter sqlDA = new SqlDataAdapter();
		sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);
		sqlDA.Fill(dataSet);
		connection.Close();
		return dataSet;
	}
}

执行到 sqlDA.Fill(dataSet); 这一步就会出现超时错误,排查了程序问题和数据库语句问题,看上去都不存在干扰因素,
经过借鉴博主文章(https://blog.youkuaiyun.com/superwfei/article/details/82494273),对数据库的存储过程语句进行了换行操作
成功解决了以上问题
修改后的存储过程类似如下模式:

Create Proc Proc_SelectTable
@StartDate datetime,--开始日期
@EndDate datetime--结束日期
as
begin
	select col1
	,col2
	,col3
	,col4
	,col5
	From table
	where a=1
	and b=2
	and c=3
end

友情提示:

尽量别在数据查询中使用如下形式的查询条件,也是一个极影响查询速度的因素
F_DetectTime<= convert(datetime, '2021.02.02 23:59:59')
他会对每一行都进行一次数据类型转化

### 回答1: sqldataadapter.fill(dataset)的意思是使用sqldataadapter对象填充dataset对象。具体来说,sqldataadapter对象可以从数据库中检索数据,并将其存储在dataset对象中,以便在应用程序中使用。这个方法是ADO.NET中常用的方法之一,用于从数据库中检索数据并将其加载到内存中的数据集中。 ### 回答2: sqldataadapter.fill(dataset)是一个用于将数据库中的数据填充到dataset中的方法。它的作用是将数据库查询得到的结果集填充到一个dataset对象中,以供后续使用。 首先,需要通过创建一个sqldataadapter对象并指定相关的sql语句或存储过程来进行数据的查询。然后,创建一个dataset对象,用于存储查询结果。 当调用sqldataadapter.fill(dataset)方法时,它会将查询结果填充到dataset对象中。这个过程会自动打开数据库连接,执行查询,并将数据读取到dataset中的相应表格中。 填充过程中,dataset对象会自动根据查询结果的表结构创建相应的表结构。如果dataset中已经存在同名表,则填充操作会清空原有的数据,并用新的数据进行替换。 在填充完成后,可以通过dataset对象中的表格和行来访问和处理查询结果的数据。可以使用LINQ、循环等方式对dataset中的数据进行遍历或操作。可以将dataset对象直接绑定到前端控件,用于显示和编辑查询结果。 通过使用sqldataadapter.fill(dataset)方法,可以方便地将数据库中的数据加载到dataset对象中,提供了对数据的灵活处理和操作。这种方式在数据访问和数据处理中广泛应用,特别适合于对查询结果进行缓存、分析和转换等场景。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风一样的虞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值