最近做了一个把本地access数据库数据上传到服务器sql数据库的程序,要说明的是access数据库内数据是时时变化的,要更新的是三个表的内容,本人的思路是这样的:
利用了3个timer控件进行对三个不同的表进行操作
每个timer控件内是按照先读取本地数据,再把读取的数据插入到sql服务器对应的表内。
问题是:1、程序一开始运行可以,但时间一长可能是几个小时吧数据就不能再上传了
        2、如果本地与服务器的网络连接出现问题,则程序会出现如死机一样的情况
请问有经验的大哥如何解决?

解决方案 »

  1.   

    1/监视一下,看软件挂起时候,状态如何,可以通过写LOG的方式跟踪.
    2/不能用TRY捕获数据POST错误吗?
      

  2.   

    1/监视一下,看软件挂起时候,状态如何,可以通过写LOG的方式跟踪.
    2/不能用TRY捕获数据POST错误吗?
      

  3.   

    是的,我在ontimer内要查找数据内有没有那个表,没有则建立那个表,再执行数据的插入什么的操作
      

  4.   

    代码
    procedure TForm1.Timer2Timer(Sender: TObject);
    var
    ...
    begin
    if (adoconnection1.Connected=false)or (adoconnection1.Connected=false) then
         begin
         exit;
         end
         else
         begin
         with adoquery2 do
         begin
           try
             close;
             sql.Clear;
             sql.Add(' if not exists (select * from dbo.sysobjects where '+
             ' id = object_id(N''[dbo].['+edit1.Text+'M'+rq+']'') and OBJECTPROPERTY(id, N''IsUserTable'') = 1)  '+
             'begin     '+
             'CREATE TABLE [dbo].['+edit1.Text+'M'+rq+'] ( '+
             '[ID] [int] IDENTITY (1, 1) NOT NULL ,'+
     '[Point] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,'+
     '[Zdz] [varchar] (6) COLLATE Chinese_PRC_CI_AS NULL , '+
     '[Pjz] [varchar] (6) COLLATE Chinese_PRC_CI_AS NULL , '+
     '[Zxz] [varchar] (6) COLLATE Chinese_PRC_CI_AS NULL , '+
     '[Sj] [varchar] (30) COLLATE Chinese_PRC_CI_AS NULL ,'+
     '[MaxTime] [datetime] NULL , '+
     '[Flag] [int] NULL '+
             ') ON [PRIMARY] '+
             ' end ');
            adoquery2.ExecSQL;
            except
            end;
          end;
        with adoquery1 do
          begin
            try
            close;
            sql.Clear;
            sql.Add('select point,[Zdz(T0)],[Pjz(T1)],[Zxz(T2)],Sj,MaxTime,Flag  from '+edit1.Text+'history');
            open;
            except
            end;
            if adoquery1.RecordCount<>0 then
            begin
              for i:=0 to adoquery1.RecordCount-1 do
               begin
                 sj := datetimetostr(adoquery1.Fields[5].asdatetime);
                 sj:=formatdatetime('YYYY-MM-DD HH:NN:SS',adoquery1.Fields[5].asdatetime);
                 adoquery1_str:='insert into '+edit1.Text+'M'+rq+' (point,Zdz,Pjz,Zxz,Sj,MaxTime,Flag) '+
                 ' values('''+adoquery1.Fields[0].AsString+''','''+adoquery1.Fields[1].AsString+''' '+
                 ','''+adoquery1.Fields[2].AsString+''','''+adoquery1.Fields[3].AsString+''''+
                 ','''+adoquery1.Fields[4].AsString+''','''+sj+''' '+
                 ','''+adoquery1.Fields[6].AsString+''')';
                  with adoquery2 do
                    begin
                      try
                      close;
                      sql.Clear;
                      sql.Add(''+adoquery1_str+'');
                      adoquery2.ExecSQL;
                      except
                      end;
                    end;
                adoquery1.Next ;
               end;
             end;
       end;
      end;
      

  5.   

    按你的程序,你在时钟的事件还没有执行完,当下一时钟事件到来时又继续执行一次又一次.错误就由此引起.我帮你加入一个处理,应该就可以解决问题了.
    代码
    procedure TForm1.Timer2Timer(Sender: TObject);
    var
    ...
    begin
     try
       Timer2.Enabled:=False;   {在这加入你原来的代码;}   Timer2.Enabled:=True;
     except
       Timer2.Enabled:=True;
     end;
    end;这样,只要本事件执行完后才会继续下一时钟事件,