我的前任留下一个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, "错误提示");
                }
            }

解决方案 »

  1.   

    如果我没有记错的话:
    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, "错误提示");
      }
      }
      

  2.   

    谢谢!!!但是我已经加过了,没有效果。同时ConnectionState的连接时间也设的很大。
    现在看来,还是UPDATE语句出现了问题,更新结果是:“按CCODE字段查询一张表单(含数个物料编码),更新时把PU_AppVouchs表里所有的相同物料编码的cdefine28,cdefine29字段,所有造成了操作时间过长”
    我想得到的结果是:我按按CCODE字段查询一张表单(含数个物料编码),更新时只把PU_AppVouchs表里含有相同的CCODE字段的相同物料编码的cdefine28,cdefine29字段处理,即先匹配CCODE字段和物料编码CINVCODE字段后更新。现在的效果只匹配了物料编码CINVCODE字段
    请问如何优化,谢谢!!
      

  3.   

    UPDATE PU_AppVouchs SET  之后怎么不见更新什么?
    致于后面那堆语句太多了,我看都是查询语句,你在SQL查询分析器里试一下,看能通过不?
      

  4.   

    更新的就是cdefine28,cdefine29字段。在数据量小的数据库可以运行通过,可以更新成功,但是把所有的相关物料编码的这两个字段都更新了。我只想更新“对应ID”and“对应物料编码”的这2个字段
      

  5.   

    加上where PU_AppVouchs.ID=‘DataClass.Class1.F30_5’
      

  6.   

     
    感谢yanele,感谢ledmhcc!!
    的确少了这行。我前几天试出来了。谢谢