⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datapageut.~pas

📁 读取大智慧股票软件中的日线数据进行分析的源代码。代码仅有读取数据部分
💻 ~PAS
📖 第 1 页 / 共 2 页
字号:
    if DM.CDS_Col.FieldValues['xoffset']<0 then
      self.VarColCnt:=self.VarColCnt+1
    else
      self.FixColLen:=self.FixColLen+1;
    if DM.CDS_Col.FieldValues['xtype']=104 then
      self.BitColCnt:=self.BitColCnt+1;
    DM.CDS_Col.Next;
  end;
  if BitColCnt>0 then
    self.FixColLen:= self.FixColLen-self.BitColCnt+((self.BitColCnt-1) mod 8)+1;

  DM.Q_Insert.Close;
  DM.Q_Insert.SQL.Clear;
  if self.HasIdentity then
    DM.Q_Insert.SQL.Add('set identity_insert dbo.'+self.ObjName+' on');



  for i:=1 to self.PageHead.m_slotCnt do
  begin
  try
    slot:=TSlot.create;
    Slot.Offset:=offsetList[i];
    Slot.Num:=i;
    Slot.PageId:=self.PageHead.m_pageId2;
    Slot.IsPrimary:=not(ReadSQLbit(Pagestream,slot.Offset,1,2,0)or ReadSQLbit(Pagestream,slot.Offset,1,3,0));
    if Slot.offset<96 then
      Slot.IsPrimary:=false;

    if Slot.IsPrimary then
    begin
      Slot.FixLen:=ReadSQLword(Pagestream,slot.Offset+2,0);
      Slot.MaxFldNo:=ReadSQLword(Pagestream,slot.Offset+Slot.FixLen,0);
      Slot.HasVarFld:=ReadSQLbit(Pagestream,slot.Offset,1,5,0);
      Slot.NullMapSize:=((Slot.MaxFldNo-1) div 8)+1;
      if Slot.HasVarFld then
        Slot.MaxVarNo:=ReadSQLword(Pagestream,slot.Offset+Slot.FixLen+2+Slot.NullMapSize,0)
      else
        Slot.MaxVarNo:=0;
      Slot.FixFldCnt:=0;
      Slot.VarFldCnt:=0;

      NullVarFldCnt:=0;

      VarNo:=0;
      valuestr:='';
      FldStr:='';

      DM.CDS_Col.First;
      while not DM.CDS_Col.Eof do
      begin
        if ReadSQLBit(Pagestream,Slot.Offset+Slot.FixLen+2,slot.NullMapSize,DM.CDS_Col.RecNo-1,0)and
           (DM.CDS_Col.FieldByName('xoffset').AsInteger<0) then
          NullVarFldCnt:=NullVarFldCnt+1;
        if DM.CDS_Col.FieldByName('xoffset').AsInteger<0 then
          Slot.VarFldCnt:=Slot.VarFldCnt+1
        else
          Slot.FixFldCnt:=Slot.FixFldCnt+1;
        DM.CDS_Col.Next;
      end;


      DM.CDS_Col.First;
      while not DM.CDS_Col.Eof do
      begin
        datatype:=DM.CDS_Col.FieldByName('xtype').AsInteger;
        case datatype of
          52: //smallint
            value:=inttostr(ReadSQLsmallint(Pagestream,slot.Offset+DM.CDS_Col.FieldByName('xoffset').AsInteger,0) );
          56: //int
            value:=inttostr(ReadSQLint(Pagestream,slot.Offset+DM.CDS_Col.FieldByName('xoffset').AsInteger,0) );
//        58: //smalldatetime
          60: //money
            value:=currtostr(ReadSQLmoney(PageStream,slot.Offset+DM.CDS_Col.FieldByName('xoffset').AsInteger,0) );
          61: //datetime
            value:=quotedstr(datetimetostr(ReadSQLdatetime(PageStream,slot.Offset+DM.CDS_Col.FieldByName('xoffset').AsInteger,0)));
          62: //float
            value:=floattostr(ReadSQLfloat(PageStream,slot.Offset+DM.CDS_Col.FieldByName('xoffset').AsInteger,0) );
          104://bit
            if ReadSQLbit(PageStream,slot.Offset+DM.CDS_Col.FieldByName('xoffset').AsInteger,1,DM.CDS_Col.FieldByName('bitpos').AsInteger,0) then
              value:='1'
            else
              value:='0';
          106://decimal
            value:=floattostr(ReadSQLdecimal(PageStream,slot.Offset+DM.CDS_Col.FieldByName('xoffset').AsInteger,DM.CDS_Col.FieldByName('length').AsInteger,DM.CDS_Col.FieldByName('xscale').AsInteger,0) );
          108://numeric
            begin
              realvalue:=ReadSQLdecimal(PageStream,slot.Offset+DM.CDS_Col.FieldByName('xoffset').AsInteger,DM.CDS_Col.FieldByName('length').AsInteger,DM.CDS_Col.FieldByName('xscale').AsInteger,0);
              value:=floattostr(realvalue);
            end;
          167://varchar
          begin
          if not Slot.HasVarFld then
            value:='Null'
          else
          begin
            if VarNo>=Slot.MaxVarNo then
            begin
              if ReadSQLBit(PageStream,Slot.Offset+Slot.FixLen+2,slot.NullMapSize,DM.CDS_Col.RecNo,0) then
                value:='Null'
              else
                value:=quotedstr('');
            end
            else
            begin
              VarNo:=VarNo+1;
              if VarNo=1 then
                VarOffset:=Slot.Offset+Slot.FixLen+2+slot.NullMapSize+2+Slot.MaxVarNo*2
              else
                VarOffset:=VarEndOffset;
              VarEndOffset:=Slot.Offset+ReadSQLWord(PageStream,Slot.Offset+Slot.FixLen+2+slot.NullMapSize+VarNo*2,0);
              if VarEndOffset>8192 then
                VarEndOffset:=VarEndOffset mod 8192;
              str:=ReadSQLChar(PageStream,VarOffset,VarEndOffset-VarOffset,0);
              value:=quotedstr(str);
            end;
          end;
          end;
          175://char
            begin
              str:=ReadSQLchar(PageStream,slot.Offset+DM.CDS_Col.FieldByName('xoffset').AsInteger,DM.CDS_Col.FieldByName('length').AsInteger,0);
              value:=quotedstr(str);
            end
          else
            value:='Null'
        end;
        if ReadSQLNullMap(PageStream,Slot.Offset+Slot.FixLen+2,DM.CDS_Col.RecNo,0) then
          value:='Null';
        if DM.CDS_Col.FieldByName('xoffset').AsInteger>=Slot.FixLen then
          value:='Null';
        if DM.CDS_Col.RecNo>Slot.MaxFldNo then
          value:='Null';
        if FldStr='' then
          FldStr:=DM.CDS_Col.FieldByName('name').AsString
        else
         FldStr:=FldStr+','+ DM.CDS_Col.FieldByName('name').AsString;
        if ValueStr='' then
          ValueStr:=value
        else
          ValueStr:=ValueStr+','+ value;
        DM.CDS_Col.Next;
      end;
      DM.Q_Insert.SQL.Add('insert '+self.ObjName+'( '+fldstr+ ') values('+valuestr+')');
    end
  finally
      freeandnil(slot);
  end;
  end;
  if self.HasIdentity then
    DM.Q_Insert.SQL.Add('set identity_insert dbo.'+self.ObjName+' off');
  if DM.Q_Insert.SQL.Count>0 then
  try
    DM.Q_Insert.ExecSQL;
  except

    if not FileExists(ErrFileName) then
    begin
      ErrFileHandle:=FileCreate(ErrFileName);
      FileClose(FileHandle);
    End;

    AssignFile(F, ErrFileName);
    Rewrite(F);
    Writeln(F,'pageid='+inttostr(self.PageHead.m_prevPage2));
    for i:=0 to DM.Q_Insert.SQL.Count-1 do
      Writeln(F,  DM.Q_Insert.SQL[i]);
    CloseFile(F);
  end;
end;



procedure TPage.SetOffsetList;
var
  i:integer;
begin
  SetLength(self.OffsetList,self.PageHead.m_slotCnt+1);
  for i:=1 to self.PageHead.m_slotCnt do
    offsetlist[i]:=ReadSQLword(PageStream,i*(-2),2);
end;

procedure TPage.SaveData;
begin
//
end;

destructor TPage.destroy;
begin
//  freemem(self.OffsetList);
//  freemem(self.Buffer);
  freeandnil(self.PageHead);
  freeandnil(self.PageStream);

  FreeAndnil(self.Slots);
//  inherited;
end;

constructor TMemoryBlock.Create;
begin
    inherited;
    self.MaxSize:=8192*128;
    pages:= TStringList.Create ;
    stream:=TMemoryStream.Create;
    stream.SetSize(MaxSize);
end;

procedure TMemoryBlock.ReadFile;
var
  buffer:pointer;
begin
      Buffer:=allocmem(MaxSize);
      LongFileSeek(FileHandle,self.Id*self.MaxSize+self.PageNum*8192,0);
      self.DataSize:=Fileread(FileHandle, buffer^, MaxSize);//
      stream.Clear;
      stream.write(Buffer^,self.MaxSize);
      freemem(buffer);
      self.PageCnt:=self.DataSize div PageLen;
end;

procedure TMemoryBlock.SetPages;
var
  page:TPage;
  i:integer;
begin
  page:=TPage.create;
  for i:=1 to self.PageCnt do
  begin
    stream.Seek((i-1)*PageLen,0);
    page.PageStream.Clear;
    page.PageStream.CopyFrom(stream,PageLen);
    page.SetPageHead;
    if page.PageHead.m_type=1 then
    begin
      if DM.CDS_Tables.Locate('id',page.PageHead.ObjId,[]) then
        if DM.CDS_Tables.FieldByName('sele').AsBoolean then
        begin
          Page.ReplTornBits;
          page.ObjName:=DM.CDS_Tables.FieldValues['name'];
          page.SetOffsetList;
          page.SetSlots;
//          pages.Addobject(page.ObjName,page);
        end;
    end;
  end;
  freeandnil(page);
  self.stream.Clear;
end;

destructor TMemoryBlock.free;
begin
  freeandnil(stream);
  freeandnil(pages);
end;

procedure TMemoryBlock.Clear;
begin
  stream.Clear;
  pages.Clear;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -