问题描述
做一个WinForm程序,算库龄,经常会出来超时错误(不是每次都有)数据库超时时间设置的是0,连接串超时时间也设置的是0,搞不清楚哪里出的问题求高手帮忙看下代码如下:publicstringGetStock(stringcInv,DateTimedtF,DateTimedtT){stringsql="";doubleiquan=0;doubleioquan=0;doubleiiquanF=0;doubleiiquanT=0;DataTabledtQuan=newDataTable();sql="selectisnull(sum(iQuantity),0)FROMSoerp_KC"+hostname+"wherebrdflag=0andcInvCName='"+cInv+"'";dtQuan=help.ExecuteDataTable(sql,help.getConnection(dbuf));if(dtQuan.Rows.Count>0)ioquan=Convert.ToDouble(dtQuan.Rows[0][0].ToString());sql="selectisnull(sum(iQuantity),0)FROMSoerp_KC"+hostname+"wherebrdflag=1andcInvCName='"+cInv+"'anddDate<'"+dtF+"'";dtQuan=help.ExecuteDataTable(sql,help.getConnection(dbuf));if(dtQuan.Rows.Count>0)iiquanF=Convert.ToDouble(dtQuan.Rows[0][0].ToString());if(iiquanF>ioquan)iiquanF=iiquanF-ioquan;elseiiquanF=0;sql="selectisnull(sum(iQuantity),0)FROMSoerp_KC"+hostname+"wherebrdflag=1andcInvCName='"+cInv+"'anddDate<'"+dtT+"'";dtQuan=help.ExecuteDataTable(sql,help.getConnection(dbuf));if(dtQuan.Rows.Count>0)iiquanT=Convert.ToDouble(dtQuan.Rows[0][0].ToString());if(iiquanT>ioquan)iiquanT=iiquanT-ioquan;elseiiquanT=0;if(iiquanT==0)iquan=0;elseiquan=iiquanT-iiquanF;returniquan.ToString("0.00");}publicSqlConnectiongetConnection(stringstrConn){SqlConnectioncon=newSqlConnection();try{con=newSqlConnection(strConn);}catch(Exception){MessageBox.Show("数据库连接出错!","系统提示",MessageBoxButtons.OK,MessageBoxIcon.Information);}returncon;}publicDataTableExecuteDataTable(stringsqlSda,SqlConnectionconn){if(conn.State!=ConnectionState.Open)conn.Open();DataTabledt=newDataTable();using(SqlCommandcmd=newSqlCommand(sqlSda,conn)){try{//cmd.CommandTimeout=0;cmd.CommandType=CommandType.Text;cmd.CommandText=sqlSda;SqlDataAdapterda=newSqlDataAdapter(cmd);da.Fill(dt);da.Dispose();}catch(Exceptionex){MessageBox.Show(ex.ToString());}conn.Close();returndt;}}
解决方案
解决方案二:
数据库超时时间设置为什么要设置为0??
解决方案三:
引用1楼duanzi_peng的回复:
数据库超时时间设置为什么要设置为0??
原本以为是设置时间太短,所以改成了0,后来发现还是会报错
解决方案四:
首先,你要尽量保证关系数据库在应用程序的“附近”。例如就在同一个机器上,或者是在同一个小的局域网内(同时要检查局域网的通讯质量如何)。其次,检查你的应用能不能用到索引。避免全表遍历数据。再次,看看没有没有可能某些“读”操作使用脏读(withnolock)方式。最后,看看业务逻辑设计有没有冗余和“故意反复”的流程,数据表的结构设计有没有蹩脚地方,业务逻辑上有没有可能更为专业(我是指业务出发)的重构设计。例如一个真正传统的库存系统,每天夜间做日结,然后第二天的数据是使用前一天的日结数据加上当天的明细数据再做日结,这样各种查询基本上都是查日报表而不是查明系。而有些不懂业务的程序员,只知道用明细去做各种统计查询,这就是因为不了解传统的统计工作而出现的“过分技术化”的问题。
解决方案五:
引用3楼sp1234的回复:
你的代码太多了,而且也没有什么“意思”,就不仔细看了。说点简单的起码的“安全规则”:首先,你要尽量保证关系数据库在应用程序的“附近”。例如就在同一个机器上,或者是在同一个小的局域网内(同时要检查局域网的通讯质量如何)。其次,检查你的应用能不能用到索引。避免全表遍历数据。再次,看看没有没有可能某些“读”操作使用脏读(withnolock)方式。最后,看看业务逻辑设计有没有冗余和“故意反复”的流程,数据表的结构设计有没有蹩脚地方,业务逻辑上有没有可能更为专业(我是指业务出发)的重构设计。例如一个真正传统的库存系统,每天夜间做日结,然后第二天的数据是使用前一天的日结数据加上当天的明细数据再做日结,这样各种查询基本上都是查日报表而不是查明系。而有些不懂业务的程序员,只知道用明细去做各种统计查询,这就是因为不了解传统的统计工作而出现的“过分技术化”的问题。
我说了,同样的查询,有时候报错,有时候不报错产品的数据库是一个完善的产品,不存在重构设计什么的我只是需要做一个报表出来麻烦指点一下具体的错误,不然说这么多一点意义对我一点用没用
解决方案六:
一般超时时间和连接时间不是不哟年管按照默认的就行吗?除非有必要才修改超时时间。你有无直接用你的报表sql去测试查询时间?
解决方案七:
引用5楼smthgdin的回复:
一般超时时间和连接时间不是不哟年管按照默认的就行吗?除非有必要才修改超时时间。你有无直接用你的报表sql去测试查询时间?
我用报错的Sql查询过,也就六七秒,所以搞不明白为什么会报错