"读进来的数据都变化很慢,从几秒到几分钟才变化"是什么意思呢?老兄是不是采用的多层结构,客户端Cursor的方式?如果那样,改一下cursor的方式试试。我觉得使用select * from ....应该可以得到最新数据的

解决方案 »

  1.   

    卫星证券行情数据库几乎每秒都在更新,所以每秒读进来的数据都应该有新的,但事实到几秒甚至几分钟才变化。文件其实是用FileOpen打开读的,用Tquery只不过证实一下数据是否没变化,结果如问题所述。是否有清文件缓存的函数,强制系统真正读文件而不是读缓存?Database Desktop却做得到,不知它内部怎样读文件的?
      

  2.   

    顺便提一下,我用BC写了同样功能的程序,在Windows的DOS窗口下运行,问题依旧。但在纯DOS方式下运行则结果正确。是否Windows对文件缓存的管理太自信了,以至不知文件已更新?
      

  3.   

       FileOpen ,你close 再open应该,就更新了:-)
      

  4.   

    close 再open也不行,Windows的缓存可能很大,整个文件都在缓存了(文件才97K)。读网络实时变化的文件你们可能很少试过吧:-(
      

  5.   


    to  lzc(阿成仔) :
      你在那家公司做?
      

  6.   

    摘抄微软《Network Programming for Windows》一段话: 
    “Microsoft Windows offers applications the capability to communicate over a network using built-in file system services. This is sometimes referred to as the network operating system (NOS) capability. (Windows使应用程序能通过作系统内建的文件系统服务在网络上通信。有时候,我们将之称为“网络作系统”(NOS)能力。)” 
    “This functionality allows applications to use common file system API functions, such as ReadFile and WriteFile, to access remote files across a network.(应用程序可自由使用一些常规的文件系统API函数,比如ReadFile和WriteFile 等通过网络访问远程文件)”
      

  7.   

    这是不是和 TDataBase 使用的事务级别有关?
      

  8.   


       我以前作过,你则样的程序,不过没有你这样的问题,不过我是直接,读写
    .dbf的,我给你源程序,你自己分析一下吧!unit dbfinter;interface
    uses sysutils;
    type
      EDBFERROR=class(Exception);
      dbf_header=record
            dbf_version:char;
            update_year:shortint;
            update_month:shortint;
            update_day:shortint;
            records:longint;
            header_length:word;
            record_length:word;
            user_argument:longint;
            reserve:array [0..15] of char;
      end;
      dbf_record=record
            field_name:array[0..10] of char;
            field_type:char;
            field_offset:longint;
            field_length:shortint;
            field_decade:shortint;
            reserved_space:array [0..13] of char;
      end;
      Tdbf=class(tobject)
         private
             head:dbf_header;
             field:array[1..100] of dbf_record;
             recordbuf:array[0..1024] of char;
         public
             filename:string;
             handle:integer;
             records:longint;
             fields:integer;
             broker:boolean;
             position:integer;
             function open(s:string):integer;
             function cell(r,c:integer):string;
             function cells(r,c:integer):string;
             function celln(r:integer;name:string):string;
             function cellns(r:integer;name:string):string;
             procedure close;
         end;implementation
    uses  windows,Dialogs,forms,spx_main,ustru;function Tdbf.open(s:string):integer;
    var r,i:integer;
        dbferr:edbferror;
    begin
        position:=-1;
        filename:=s;
        handle:=fileopen(s,fmopenread or fmsharedenynone);
        result:=handle;
        if (handle > 0) then
        begin
            broker:=false;
            fileseek(handle,0,0);
            if fileread(handle,head,32) < 32 then
            begin
                dbferr:=edbferror.Create('DBFERROR');
                broker:=true;
                main_form.logmess(LOGT_MESSAGE,0,'文件'+filename+'不存在');
                raise dbferr;
                exit;
            end;
            r:=(head.header_length-32) div 32;
            for i:=1 to r do
            begin
                if fileread(handle,field[i],32) < 32 then
                begin
                    dbferr:=edbferror.Create('DBFERROR');
                    broker:=true;
                    main_form.logmess(LOGT_MESSAGE,0,'文件'+filename+'不存在');
                    raise dbferr;
                    exit;
                end;
            end;
            records:=head.records;
            fields:=r;
        end
        else
        begin
            broker:=true;
            main_form.logmess(LOGT_MESSAGE,0,'文件'+filename+'不存在');
        end;
    end;function Tdbf.cell(r,c:integer):string;
    var
        offset:longint;
        len:integer;
        s:string[255];
        i:integer;
        dbferr:edbferror;
    begin
        if broker = true then
        begin
            open(filename);
        end;
        offset:=head.header_length + (r-1)*head.record_length;
        if position <> r then
        begin
            fileseek(handle,offset,0);
            if fileread(handle,recordbuf,head.record_length) < head.record_length then
            begin
                dbferr:=edbferror.Create('DBFERROR');
                broker:=true;
                main_form.logmess(LOGT_MESSAGE,0,'文件'+filename+'不存在');
                raise dbferr;
                exit;
            end;
            position:=r;
        end;
        if (recordbuf[0] = char(0)) then
        begin
            recordbuf[0]:=char(32);
        end;
        if (c = 0) then
        begin
            offset:=0;
            len:=1;
        end
        else
        begin
            offset:=1;
            for i:=1 to c-1 do
                offset:=offset+field[i].field_length;
            len:=field[c].field_length;
        end;
        s:=copy(recordbuf,offset+1,len);
        if ((c <> 0) and (field[c].field_type = 'N')) then
        begin
            try
                if (field[c].field_decade <> 0) then
                begin
                    if pos('.-',s) = 0 then
                    begin
                        s:=format('%.'+inttostr(field[c].field_decade)+'f',[strtofloat(trim(s))]);
                    end
                    else
                    begin
                        s:='0.00';
                    end;
                end
                else
                begin
                    s:=inttostr(strtoint(trim(s)));
                end;
                result:=s;
            except
                result:='0';
            end;
        end
        else
           result:=s;
    end;function Tdbf.cells(r,c:integer):string;
    var
        offset:longint;
        len:integer;
        s:string[255];
        i:integer;
        dbferr:edbferror;
    begin
        if broker = true then
        begin
            open(filename);
        end;
        offset:=head.header_length + (r-1)*head.record_length;
        if position <> r then
        begin
            fileseek(handle,offset,0);
            if fileread(handle,recordbuf,head.record_length) < head.record_length then
            begin
                dbferr:=edbferror.Create('DBFERROR');
                broker:=true;
                main_form.logmess(LOGT_MESSAGE,0,'文件'+filename+'不存在');
                raise dbferr;
                exit;
            end;
            position:=r;
        end;
        if (recordbuf[0] = char(0)) then
        begin
            recordbuf[0]:=char(32);
        end;
        if (c = 0) then
        begin
            offset:=0;
            len:=1;
        end
        else
        begin
            offset:=1;
            for i:=1 to c-1 do
                offset:=offset+field[i].field_length;
            len:=field[c].field_length;
        end;
        s:=copy(recordbuf,offset+1,len);
        result:=s;
    end;function Tdbf.celln(r:integer;name:string):string;
    var i,c:integer;
    begin
        if broker = true then
        begin
            open(filename);
        end;
        for i:=1 to fields do
        begin
            if (uppercase(field[i].field_name) = uppercase(name)) then
            begin
                c:=i;
                result:=cell(r,c);
                exit;
            end;
        end;
        result:='';
    end;function Tdbf.cellns(r:integer;name:string):string;
    var i,c:integer;
    begin
        if broker = true then
        begin
            open(filename);
        end;
        for i:=1 to fields do
        begin
            if (uppercase(field[i].field_name) = uppercase(name)) then
            begin
                c:=i;
                result:=cells(r,c);
                exit;
            end;
        end;
        result:='';
    end;procedure Tdbf.close;
    begin
        if handle > 0 then
        begin
            try
               fileclose(handle);
            except
            end;
        end;
    end;end.