我的前任留下一个VS2005 C# +SQL2000的程序源代码。作用是调用,分组统计用友U8帐套数据库里的部分数据, 并更新其中一个表的两个自定义字段。
前段时间运作正常,但是近日在做更新操作时突然出现数据库超时提示:“超时时间已到。在操作完成之前超时时间已过或服务器未响应。语句已终止。”小弟对C#和SQL语言都不熟,自己琢磨的结果是,该语句在‘更新操作"是设置了条件是 当PU_AppVouchs表中的(ID字段=DataClass.Class1.F30_5【WINFROM控件中提取的参数】关联的ID字段时),按“物料编码CINVCODE”字段更新这一部分ID字段的cdefine28,cdefine29。两个字段。
但是实际运行时,程序没有按这个条件先行过滤。直接按“物料编码CINVCODE”字段匹配更新。请各位老师指正并叫我怎样优化,谢谢!!PU_AppVouchs 要更新的表 含‘物料编码CINVCODE’‘ID’'iquantity'[需要分组求和项], ireceivedqty[需要分组求和项]
其实相关的分组求和项,各个要显示的数据不需要管它,我都验证过来,查询时间不超过30秒。请各位帮我看看如何实现先过滤出 PU_AppVouchs表中的(ID字段=DataClass.Class1.F30_5【WINFROM控件中提取的参数】关联的ID字段 的行,更新这一部分ID字段的cdefine28,cdefine29。两个字段。谢谢,以下是源码
===================================
private void eee_Click(object sender, EventArgs e)
{
DialogResult dr = MessageBox.Show("您确定修改采购单号为 " + DataClass.Class1.F30_5 + " 的U8_ERP记录吗?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (dr == DialogResult.Yes)
{
try
{
SqlConnection conn1 = new SqlConnection(); conn1.ConnectionString = "server=192.168.5.159;database=ufdata_100_2010;uid=sa;pwd=123456";/ /数据库和密码
conn1.Open();
SqlCommand com = new SqlCommand();
com = new SqlCommand(" UPDATE PU_AppVouchs SET
cdefine29= (SELECT TT.订单在途量 FROM (SELECT PP.存货编码, SUM(PP.订单在途量) 订单在途量 FROM (SELECT CINVCODE AS 存货编码 ,sum (iquantity) as 总累计订单数,sum (isnull(ireceivedqty,0)) as 总累计入库数,sum(iquantity-isnull(ireceivedqty,0)) as 订单在途量 FROM ERP2010..[LSP_F13] GROUP BY CINVCODE UNION all select CINVCODE AS 存货编码 , substring(cast(sum( iquantity) as varchar(20)),1,(len( sum( iquantity) )-7)) as 总订单数量, substring(cast(sum( ireceivedqty) as varchar(20)),1,(len( sum( ireceivedqty) )-7)) as 总累计入库量,substring(cast(sum( iquantity- ireceivedqty) as varchar(20)),1,(len( sum( iquantity-ireceivedqty) )-7)) as 总累计在途 from ufdata_100_2010..om_mobody where cbcloser='' GROUP BY CINVCODE, CINVNAME ) PP GROUP BY PP.存货编码) TT WHERE CINVCODE=TT.存货编码 AND id=(select id from PU_AppVouch where ccode ='" + DataClass.Class1.F30_5 + "') ) ,
cdefine28= (SELECT TT.现存量 FROM ( select id , cinvcode 存货编码 , pp.现存量 from PU_AppVouchs a left join ( SELECT CINVCODE AS 存货编码,substring(cast(sum(IQTTY) as varchar(20)),1,(len(sum(IQTTY) )-7))AS 现存量 FROM ERP2010..liang_LSP where cwhcode in('1010','1012','3012','3002') and CINVCCODE not in('101','103') group by CINVCODE) pp on a.cinvcode=pp.存货编码 ) TT WHERE CINVCODE=TT.存货编码 AND id=(select id from PU_AppVouch where ccode='" + DataClass.Class1.F30_5 + "')) ", conn1);
if (conn1.State == ConnectionState.Closed)
{
conn1.Open();
}
com.ExecuteNonQuery();
MessageBox.Show("更新成功,请查询U8_ERP相关请购单!");
conn1.Close();
conn1.Dispose();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误提示");
}
}
前段时间运作正常,但是近日在做更新操作时突然出现数据库超时提示:“超时时间已到。在操作完成之前超时时间已过或服务器未响应。语句已终止。”小弟对C#和SQL语言都不熟,自己琢磨的结果是,该语句在‘更新操作"是设置了条件是 当PU_AppVouchs表中的(ID字段=DataClass.Class1.F30_5【WINFROM控件中提取的参数】关联的ID字段时),按“物料编码CINVCODE”字段更新这一部分ID字段的cdefine28,cdefine29。两个字段。
但是实际运行时,程序没有按这个条件先行过滤。直接按“物料编码CINVCODE”字段匹配更新。请各位老师指正并叫我怎样优化,谢谢!!PU_AppVouchs 要更新的表 含‘物料编码CINVCODE’‘ID’'iquantity'[需要分组求和项], ireceivedqty[需要分组求和项]
其实相关的分组求和项,各个要显示的数据不需要管它,我都验证过来,查询时间不超过30秒。请各位帮我看看如何实现先过滤出 PU_AppVouchs表中的(ID字段=DataClass.Class1.F30_5【WINFROM控件中提取的参数】关联的ID字段 的行,更新这一部分ID字段的cdefine28,cdefine29。两个字段。谢谢,以下是源码
===================================
private void eee_Click(object sender, EventArgs e)
{
DialogResult dr = MessageBox.Show("您确定修改采购单号为 " + DataClass.Class1.F30_5 + " 的U8_ERP记录吗?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (dr == DialogResult.Yes)
{
try
{
SqlConnection conn1 = new SqlConnection(); conn1.ConnectionString = "server=192.168.5.159;database=ufdata_100_2010;uid=sa;pwd=123456";/ /数据库和密码
conn1.Open();
SqlCommand com = new SqlCommand();
com = new SqlCommand(" UPDATE PU_AppVouchs SET
cdefine29= (SELECT TT.订单在途量 FROM (SELECT PP.存货编码, SUM(PP.订单在途量) 订单在途量 FROM (SELECT CINVCODE AS 存货编码 ,sum (iquantity) as 总累计订单数,sum (isnull(ireceivedqty,0)) as 总累计入库数,sum(iquantity-isnull(ireceivedqty,0)) as 订单在途量 FROM ERP2010..[LSP_F13] GROUP BY CINVCODE UNION all select CINVCODE AS 存货编码 , substring(cast(sum( iquantity) as varchar(20)),1,(len( sum( iquantity) )-7)) as 总订单数量, substring(cast(sum( ireceivedqty) as varchar(20)),1,(len( sum( ireceivedqty) )-7)) as 总累计入库量,substring(cast(sum( iquantity- ireceivedqty) as varchar(20)),1,(len( sum( iquantity-ireceivedqty) )-7)) as 总累计在途 from ufdata_100_2010..om_mobody where cbcloser='' GROUP BY CINVCODE, CINVNAME ) PP GROUP BY PP.存货编码) TT WHERE CINVCODE=TT.存货编码 AND id=(select id from PU_AppVouch where ccode ='" + DataClass.Class1.F30_5 + "') ) ,
cdefine28= (SELECT TT.现存量 FROM ( select id , cinvcode 存货编码 , pp.现存量 from PU_AppVouchs a left join ( SELECT CINVCODE AS 存货编码,substring(cast(sum(IQTTY) as varchar(20)),1,(len(sum(IQTTY) )-7))AS 现存量 FROM ERP2010..liang_LSP where cwhcode in('1010','1012','3012','3002') and CINVCCODE not in('101','103') group by CINVCODE) pp on a.cinvcode=pp.存货编码 ) TT WHERE CINVCODE=TT.存货编码 AND id=(select id from PU_AppVouch where ccode='" + DataClass.Class1.F30_5 + "')) ", conn1);
if (conn1.State == ConnectionState.Closed)
{
conn1.Open();
}
com.ExecuteNonQuery();
MessageBox.Show("更新成功,请查询U8_ERP相关请购单!");
conn1.Close();
conn1.Dispose();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误提示");
}
}
解决方案 »
- 获取文件夹下固定的文件
- C# Form2用委托改Form1控件属性,编译通过但没结果,求助!!!!!
- 想不出来了,提问。。。
- 急!!! 如何获取messageBox的值
- 如何利用dataset查找后的数据!
- 怎样将当前页面中DataGrid选中的数据全部删除
- *********目前做Delphi开发,觉得没什么前途,薪水也少,正学Oracle存储过程和触发器编程,以及VC数据库编程呢,请问在公司偷偷学和练行
- 个别网页关键的会话部分抓不下来,有经验的进来分析一下!
- 如何在c#web开发中的两个页面间传参数和接收参数
- 用户控件有什么作用 ,他跟WINDOWS窗体没什么区别
- 如何判断一个字符串是否是有效时间?
- C#.NET如何改变已显示出来的TreeNode的标签文字(Text)
if (conn1.State == ConnectionState.Closed)
{
conn1.Open();
}
com.CommandTimeout = 0; //加上此句,0表示是控制超时
com.ExecuteNonQuery();
MessageBox.Show("更新成功,请查询U8_ERP相关请购单!");
conn1.Close();
conn1.Dispose();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误提示");
}
}
现在看来,还是UPDATE语句出现了问题,更新结果是:“按CCODE字段查询一张表单(含数个物料编码),更新时把PU_AppVouchs表里所有的相同物料编码的cdefine28,cdefine29字段,所有造成了操作时间过长”
我想得到的结果是:我按按CCODE字段查询一张表单(含数个物料编码),更新时只把PU_AppVouchs表里含有相同的CCODE字段的相同物料编码的cdefine28,cdefine29字段处理,即先匹配CCODE字段和物料编码CINVCODE字段后更新。现在的效果只匹配了物料编码CINVCODE字段
请问如何优化,谢谢!!
致于后面那堆语句太多了,我看都是查询语句,你在SQL查询分析器里试一下,看能通过不?
感谢yanele,感谢ledmhcc!!
的确少了这行。我前几天试出来了。谢谢