Winform执行存储过程时间超长,但存储过程在数据库执行非常快

weixin_41664753 2018-03-08 10:05:15
Winform执行存储过程时间超长,但存储过程在数据库执行非常快,这是什么情况?
前台只负责传两个入参给存储过程,所有业务逻辑都在存储过程里执行。请大神帮忙指导下,感谢!

SqlConnection Conn_his = new SqlConnection(str);
SqlCommand sqlcom = new SqlCommand();
sqlcom.Connection = Conn_his;
sqlcom.CommandText = proc_name;
sqlcom.CommandTimeout = 10000;
sqlcom.CommandType = CommandType.StoredProcedure;
IDataParameter[] parameters = {
new SqlParameter("@ksrq", SqlDbType.NVarChar,8) ,
new SqlParameter("@jsrq", SqlDbType.NVarChar,8) ,
new SqlParameter("@msg", SqlDbType.NVarChar,50)
};
// 设置参数类型
parameters[0].Value = this.ksrq.Text.ToString().Replace("-", "");
parameters[1].Value = this.jsrq.Text.ToString().Replace("-", "");
parameters[2].Direction = ParameterDirection.Output; // 设置为输出参数
// 添加参数
sqlcom.Parameters.Add(parameters[0]);
sqlcom.Parameters.Add(parameters[1]);
sqlcom.Parameters.Add(parameters[2]);

Conn_his.Open();
// 执行存储过程并返回影响的行数
sqlcom.ExecuteNonQuery().ToString(); ;
Msg = parameters[2].Value.ToString();
...全文
539 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_41664753 2018-03-09
  • 打赏
  • 举报
回复
引用 7 楼 hanjun0612 的回复:
[quote=引用 6 楼 weixin_41664753 的回复:] [quote=引用 1 楼 hanjun0612 的回复:] 你单步调试一下: Conn_his.Open(); 看看这个时间长不长
插入断点到 Conn_his.Open(),提示:总是中断,请问这是什么情况,谢谢?[/quote] 1 查看你的数据库连接字符串是否正确。 2 查看你的网络。 3 ping一下你的服务器看看[/quote]感谢您的提醒。后来我发现,大数据插入时,为了防止重重插入,对临时表加了标志,每次插入前会判断是否存在,并且update这个标志,后来改成了重复就delete,速度一下子快了N倍。
吉普赛的歌 2018-03-08
  • 打赏
  • 举报
回复
--数据分布不均匀,执行计划重用引用了参数嗅探
ALTER PROCEDURE Proc_Name
@ksrq NVarChar(8),
@jsrq NVarChar(8),
@msg NVarChar(50)
WITH RECOMPILE		--加上这行就可以了
AS
BEGIN
	SET NOCOUNT ON
	--......
END
xuzuning 2018-03-08
  • 打赏
  • 举报
回复
你的程序是包含数据库连接的,而在数据库管理器中运行时,数据库已经连接上了 所以你说的慢,实际是数据库连接慢
正怒月神 2018-03-08
  • 打赏
  • 举报
回复
引用 6 楼 weixin_41664753 的回复:
[quote=引用 1 楼 hanjun0612 的回复:] 你单步调试一下: Conn_his.Open(); 看看这个时间长不长
插入断点到 Conn_his.Open(),提示:总是中断,请问这是什么情况,谢谢?[/quote] 1 查看你的数据库连接字符串是否正确。 2 查看你的网络。 3 ping一下你的服务器看看
weixin_41664753 2018-03-08
  • 打赏
  • 举报
回复
引用 1 楼 hanjun0612 的回复:
你单步调试一下: Conn_his.Open(); 看看这个时间长不长
插入断点到 Conn_his.Open(),提示:总是中断,请问这是什么情况,谢谢?
weixin_41664753 2018-03-08
  • 打赏
  • 举报
回复
引用 4 楼 From_TaiWan 的回复:
还有,数据库是不是在远程,那要检查#1说的 open
确实是远程调用。
秋的红果实 2018-03-08
  • 打赏
  • 举报
回复
还有,数据库是不是在远程,那要检查#1说的 open
秋的红果实 2018-03-08
  • 打赏
  • 举报
回复
目测,不是这里的问题 请检查程序其他地方 相同的存储过程在程序里调用,要比在sql管理器执行快
  • 打赏
  • 举报
回复
SqlDbType.NVarChar 确认这个与你存储过程定义的一致,这个有可能导致数据库隐式转换varchar之类的导致慢
正怒月神 2018-03-08
  • 打赏
  • 举报
回复
你单步调试一下: Conn_his.Open(); 看看这个时间长不长

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧