我用Ado + Sql server作一个医院的管理系统,但是当我选择药品的时候总是很慢(库中的数据大概5千多条吧)为什么?请尽快解决,高分的,真的能解决问题的话300分加上这100分呀

解决方案 »

  1.   

    仅仅说ADO+SQL SERVER这样没有问题的,我的数据有几十万条,查询起来也很快。
    速度慢的原因有以下几点,你看是不是你的也有这样:
    1、硬件,硬件的配置较低,尤其是内存和CPU,我见过有人这样统计过,就是当SQL SERVER的使用内存达到250M左右的时候,速度会明显下降。我没有试过,因为我的程序的客户端没有那么多。
    2、使用存储过程、触发器较多。尤其是触发器。你先要了解一下触发器的原理,就是当记录改变时触发。当执行完触发器的内容时才再次执行以下的内容。所以触发器如果太多,是影响速度的主要原因。
    3、编写程序的优化性。如果一个程序在使用数据库和数据库相连的时候,当你的控件使用完以后一定要关闭,要不然跟数据库一直常连状态,也会是影响速度原因。以上就是我使用的过程中发现的问题。一般情况下影响速度的就是以上几种。
      

  2.   

    就是这么一段代码,看看怎么帮我优化一下if OperType = 'InMZSF' then
        with DM.AdoQuery_YPQuery do
        begin
      //------- -----------------------------分类给数据---------------------------
          with DM.AdoQuery_Tmp do
          begin
            close;
            sql.clear;
            sql.add('select * from MZSF_Mx');
            sql.add('where JZCode = :JZCode and YP_Name = :YP_Name and YPPH = :YPPH');
            parameters.ParamByName('JZcode').value := Frm_InMZSF.MaxCode;
            parameters.ParamByName('YP_Name').Value := DM.ADOQuery_YPQuery.FieldValues['FK_ypName'];
            Parameters.ParamByName('YPPH').Value := DM.AdoQuery_YPQuery.fieldvalues['YPPH'];
            open;
            if Recordcount > 0 then
            begin
              Application.MessageBox('选择的药品有重复,请检查!','提示',MB_ICONWarning + MB_OK);
              exit;
            end;
          end;
          if DM.ADOQuery_YPQuery.FieldValues['FK_YPSL'] > 0 then //判断库存中是否有存货
          with DM.adoQuery_InMZSF do
          begin
            close;
            sql.clear;
            sql.add('select * from Mzsf_mx');
            open;
            insert;
            fieldbyname('JZCode').value  := Frm_InMZSF.MaxCode;
            fieldbyname('YPBillCode').value  :=DM.ADOQuery_YPQuery.FieldValues['YP_BillCode'];
            fieldbyname('YPCode').value  :=DM.ADOQuery_YPQuery.FieldValues['YP_PhyCode'];
            fieldbyname('yp_Name').value  :=DM.ADOQuery_YPQuery.FieldValues['FK_ypName'];
            fieldByName('YP_DW').Value := DM.ADOQuery_YPQuery.fieldValues['FK_YPDW'];
            fieldbyname('yp_Spell').value  := DM.ADOQuery_YPQuery.FieldValues['FK_ypJM'];
            fieldbyname('yp_GG').value  := DM.ADOQuery_YPQuery.FieldValues['FK_ypGG'];
            if RYLB <> '公用' then
              fieldbyname('yp_DJ').value  := DM.ADOQuery_YPQuery.FieldValues['YK_YPOutPrice']
            else
              if RYLB = '公用' then
                fieldbyname('yp_DJ').value  := DM.ADOQuery_YPQuery.FieldValues['FK_YPInprice'];
            fieldByName('YP_SL').Value := DM.ADOQuery_YPQuery.FieldValues['FK_YPSL'];
            fieldByName('MZSFType').Value := '药费';
            fieldbyname('SumJE').value := DM.ADOQuery_YPQuery.FieldValues['YK_YPOutPrice'] * DM.ADOQuery_YPQuery.FieldValues['FK_YPSL'];
            fieldbyname('YPPH').Value := DM.adoquery_YPQuery.FieldValues['YPPH'];
            fieldbyname('YP_Inprice').Value := DM.AdoQuery_YPQuery.FieldValues['FK_YPInprice'];
            post;
          end
          else
            exit;
        end;
        if OperType = 'OutMZSF' then
        begin
          with DM.AdoQuery_Tmp do
          begin
            close;
            sql.clear;
            sql.add('select * from MZSF_Mx');
            sql.add('where JZCode = :JZCode and YP_Name = :YP_Name and YPPH = :YPPH');
            parameters.ParamByName('JZcode').value := Frm_OutMZSF.MaxCode;
            parameters.ParamByName('YP_Name').Value := DM.ADOQuery_YPQuery.FieldValues['FK_ypName'];
            parameters.ParamByName('YPPH').Value := DM.ADOQuery_YPQuery.FieldValues['YPPH'];
            open;
            if Recordcount > 0 then
            begin
              Application.MessageBox('选择的药品有重复,请检查!','提示',MB_ICONWarning + MB_OK);
              exit;
            end;
          end;
          if DM.ADOQuery_YPQuery.FieldValues['FK_YPSL'] > 0 then //判断库存中是否有存货
          begin
          with DM.adoQuery_OutMZSF do
          begin
            close;
            sql.clear;
            sql.add('select * from Mzsf_mx');
            open;
            Insert;
            fieldbyname('JZCode').value  := Frm_OutMZSF.MaxCode;
            fieldbyname('YPBillCode').value  :=DM.ADOQuery_YPQuery.FieldValues['YP_BillCode'];
            fieldbyname('YPCode').value  :=DM.ADOQuery_YPQuery.FieldValues['YP_PhyCode'];
            fieldbyname('yp_Name').value  :=DM.ADOQuery_YPQuery.FieldValues['FK_ypName'];
            fieldByName('YP_DW').Value := DM.ADOQuery_YPQuery.fieldValues['FK_YPDW'];
            fieldbyname('yp_Spell').value  := DM.ADOQuery_YPQuery.FieldValues['FK_ypJM'];
            fieldbyname('yp_GG').value  := DM.ADOQuery_YPQuery.FieldValues['FK_ypGG'];
            fieldbyname('yp_DJ').value  := DM.ADOQuery_YPQuery.FieldValues['YK_YPOutPrice'] * Frm_OutMZSF.TJBL;
            fieldByName('YP_SL').Value := DM.ADOQuery_YPQuery.FieldValues['FK_YPSL'];
            fieldByName('MZSFType').Value := '药费';
            fieldbyname('SumJE').value := DM.ADOQuery_YPQuery.FieldValues['YK_YPOutPrice'] * DM.ADOQuery_YPQuery.FieldValues['FK_YPSL'];
            fieldbyname('YPPH').Value := DM.adoquery_YPQuery.FieldValues['YPPH'];
            post;
          end;
         end;
        end;
        if OperType = 'LLYY' then
        begin
          with DM.AdoQuery_Tmp do
          begin
            close;
            sql.clear;
            sql.add('select * from llMZSF_Mx');
            sql.add('where JZCode = :JZCode and YP_Name = :YP_Name and yp_GG = :YP_GG');
            parameters.ParamByName('JZcode').value := StrToInt(Frm_LLYY.Edit_code.text);
            parameters.ParamByName('YP_Name').Value := DM.ADOQuery_YPQuery.FieldValues['FK_ypName'];
            parameters.ParamByName('YP_GG').Value := DM.ADOQuery_YPQuery.FieldValues['FK_ypGG'];
            open;
            if Recordcount > 0 then
            begin
              Application.MessageBox('选择的药品有重复,请检查!','提示',MB_ICONWarning + MB_OK);
              exit;
            end;
          end;
          with DM.adoQuery_LLYY do
          begin
            close;
            sql.clear;
            sql.add('select * from LLMzsf_mx');
            open;        Insert;
            fieldbyname('JZCode').value  := StrToInt(Frm_LLYY.Edit_Code.text);
            fieldbyname('YPBillCode').value  :=DM.ADOQuery_YPQuery.FieldValues['YP_BillCode'];
            fieldbyname('YPCode').value  :=DM.ADOQuery_YPQuery.FieldValues['YP_PhyCode'];
            fieldbyname('yp_Name').value  :=DM.ADOQuery_YPQuery.FieldValues['FK_ypName'];
            fieldByName('YP_DW').Value := DM.ADOQuery_YPQuery.fieldValues['FK_YPDW'];
            fieldbyname('yp_Spell').value  := DM.ADOQuery_YPQuery.FieldValues['FK_ypJM'];
            fieldbyname('yp_GG').value  := DM.ADOQuery_YPQuery.FieldValues['FK_ypGG'];
            fieldbyname('yp_DJ').value  := DM.ADOQuery_YPQuery.FieldValues['YK_YPOutPrice'];
            fieldByName('YP_SL').Value := DM.ADOQuery_YPQuery.FieldValues['FK_YPSL'];
            fieldByName('LLMZSFType').Value := '药费';
            fieldbyname('SumJE').value := DM.ADOQuery_YPQuery.FieldValues['YK_YPOutPrice'] * DM.ADOQuery_YPQuery.FieldValues['FK_YPSL'];
            post;
          end;
        end;
      finally
        Frm_YPQuery.close;
      end;
      

  3.   

    try
      DisableControls
      查询
      ...
    finally
      EnableControls
      

  4.   

    对付SQLSERVER查询速度,最有效的方法就是用其带的事件探查器,跟踪执行过程,找到在那条语句上,执行速度较慢,再分析原因(一般是由于表太大,或者是视图级数太多),然后确定SQL语句中的条件句,尽量减小数据集中记录的个数(包括视图)。要是SQL语句的执行速度并不慢,那就去审查并调或重新设计自己的算法或处理过程.
      

  5.   

    当然慢了!你的代码写的太笨了,用一些技巧会好的,其实用不了这么多代码的,第一个Part你只是想知有没有数据,应该用Count在SQL里写
    你把所有列都SELECT了,能不慢吗?在SELECT时最好不要用如“SELECT * FROM”类似的语句
    只SELECT需要的列就可以了。不过这些不是慢的根本原因,但如果这类代码多了会明显慢的!!!
      

  6.   

    小弟的解决方法:
    你把要执行的SQL语句都直接在SQL SERVER上执行,如果也慢。说明机器太弱了。如果直接在SQLSERVER上运行不慢的话(一般没问题才5000条呀!大哥!这是一个多么小的库呀!)那么你的代码一定有问题。
    我估计你的代码问题,可能是主要原因。因为SQLSERVER查询速度不慢。特别是仅有5000条呀!
    楼上几位同志们的办法你也可以用上,比如加disablecontrols.但我的意见是你的代码不行呀。有点外H.
      

  7.   

    我呢,完完全全用SQL语句来实现,几十万条记录,也还行的,你的连外连接都没有,应该不会,你们是多少M的网卡?服务器是什么样的?
      

  8.   

    1。你的表MZSF_Mx 上要建立索引,字段JZCode,YP_Name YPPH,
    2。你向Mzsf_mx及其它表插入新记录的时候不要用你的那方法(先把整个表打开再EDIT),建议你用SQL语句Insert into 来实现
      

  9.   

    lihao_ningxia(耗子) 我现在还没有用网络版的呢,我现在只是先用单机作试验呢
    belllab(菜鸟)  你说的方法我会试一下的
      

  10.   

    是不是由于我的Win2k是sp3的,别人的不是的缘故呢,和Ado的版本有关吗?