回 帖 发 新 帖 刷新版面

主题:长二进制数据

附件中是ACCESS数据,我想把数据库表exam_result中字段examresult里的长二进制数据记录的数据用dbgrid组件或DBeidt组件逐项显示出来并修改后保存回去,请高手送源码!

回复列表 (共10个回复)

沙发

必须要知道长二制数据是什么文件格式。

板凳

必须要先知道长二制数据是什么文件!

3 楼

我也不清楚是什么格式!!!因这个数据库不是我创建的,我自已通过内存流写入的我也能读出来,请高手想办法破解格式,拜托各位了!!

4 楼


数据库里是一条条记录,我想其数据格式是结构体。

5 楼

数据读出来没有问题,但你如果不知道他的文件格式,你根本不知道用什么应用程序来打开它。如果你自己非要用流的形式然后打开它,肯定是一堆二进制乱码。

6 楼

写入数据的程序是DELPHI6.0,但我运行时出现很多问题,程序中的一部分如下:
    ERDA_swap:TExam_Result_DB_All;//在本单元做交换数据用
 procedure TDataManageForm.DBEdit11Change(Sender: TObject);
begin
  if DBEdit11.Text <> '' then
    DateTimePicker11.DateTime := StrToDate(DBEdit11.Text)
  else
    DateTimePicker11.DateTime := StrToDate('1900-1-1');
end;

procedure TDataManageForm.FormCreate(Sender: TObject);
begin
  with ADODataSet_DataManage_info do
    begin
      Close;
      CommandText := 'select *  from autoinfo';
      Open;
    end;    // with
end;

procedure TDataManageForm.ADODataSet_DataManage_infoAfterOpen(
  DataSet: TDataSet);
var
  sTotal: string;
begin
  sTotal := IntToStr(ADODataSet_DataManage_info.RecordCount);
  Caption := '档案管理->总共检索到 '+ sTotal + ' 个记录。';
  if sTotal = '0' then
    ClearDisplay;
end;

procedure TDataManageForm.FormDestroy(Sender: TObject);
begin
  ADODataSet_DataManage_info.Close;
  ADODataSet_DataManage_xx.Close;
end;

function TDataManageForm.ReadDataFromDB(var ERDA:TExam_Result_DB_All;
  ETN: string): integer;
var
  BS: TADOBloBStream;
  sTotal:string;
  sCurExamNo:string;
begin
  result := -1;
  sCurExamNo := '';
  with ADODataSet_DataManage_xx do
    begin
      Active := False;
      CommandText := 'Select * from exam_result where jcbh ='+''''+ETN+'''';
      Active := True;
      if FieldByName('flag').AsString = '1' then
        begin
          sCurExamNo := FieldByName('jcbh').AsString;
          BS := TADOBloBStream.Create(TBlobField(FieldByName('examresult')),bmRead);
          try
            BS.Seek(0,0);
            result := BS.Read(ERDA,Sizeof(ERDA));
          finally // wrap up
            BS.Free;
          end;    // try/finally
        end;
    end;    // with
  sTotal := IntToStr(ADODataSet_DataManage_info.RecordCount);
  Caption := '档案管理->总共检索到 '+ sTotal + ' 个记录,当前检测表号(为空表示不存在检测数据):'+sCurExamNo;
end;

function TDataManageForm.WriteDataToDB(const ERDA:TExam_Result_DB_All;
  ETN: string): integer;
var
  BS: TADOBloBStream;
begin
  result := -1;
  with ADODataSet_DataManage_xx do
    begin
      Close;
      CommandText := 'Select * from exam_result where jcbh ='+''''+ETN+'''';
      Open;
      Edit;
      FieldByName('flag').AsString := '1';
      BS := TADOBlobStream.Create(TBlobField(FieldByName('examresult')), bmWrite);
      try
        BS.Seek(0,0);
        result := BS.Write(ERDA, Sizeof(ERDA));
      finally
        BS.Free;
      end;
      Post;
    end;    // with
end;

procedure TDataManageForm.Display;
var
 Automobile_DM: TAutomobile;
 ss:Tsys_Std;
// yu:word;
begin
  with tsGrid1 do
    begin
      Automobile_DM := TAutomobile.Create;
      sys_StdStream.LoadStd(DBEdit31.Text,ss);
      Automobile_DM.BiaoZhun := ss;

      Cell[2,2] := ERDA_swap.Exam_Result_DB[1].value; //CO

      Cell[3,2] := ERDA_swap.Exam_Result_DB[1].times;
      if ERDA_swap.Exam_Result_DB[1].value<=ss.yyht_max then
        ERDA_swap.Exam_Result_DB[1].opinion:=0
        else
        ERDA_swap.Exam_Result_DB[1].opinion:=1;
      Cell[4,2] := ERDA_swap.Exam_Result_DB[1].opinion;

      Cell[2,3] := ERDA_swap.Exam_Result_DB[2].value;//HC
      Cell[3,3] := ERDA_swap.Exam_Result_DB[2].times;
      if ERDA_swap.Exam_Result_DB[2].value<=ss.thq_max then
        ERDA_swap.Exam_Result_DB[2].opinion:=0
        else
        ERDA_swap.Exam_Result_DB[2].opinion:=1;
      Cell[4,3] := ERDA_swap.Exam_Result_DB[2].opinion;

      Cell[2,4] := ERDA_swap.Exam_Result_DB[3].value; //RB-1
      Cell[3,4] := ERDA_swap.Exam_Result_DB[3].times;
      Cell[4,4] := ERDA_swap.Exam_Result_DB[3].opinion;

      Cell[2,5] := ERDA_swap.Exam_Result_DB[4].value;//RB-2
      Cell[3,5] := ERDA_swap.Exam_Result_DB[4].times;
      Cell[4,5] := ERDA_swap.Exam_Result_DB[4].opinion;

7 楼

读二进制数据的代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var
  SQL: string;
  jcbh, flag, fileName: string;
begin
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  SQL := 'SELECT * FROM exam_result';
  ADOQuery1.SQL.Add(SQL);
  ADOQuery1.Open;
  while not ADOQuery1.Eof do
  begin
    jcbh := ADOQuery1.Fields.Fields[0].AsString;
    flag := ADOQuery1.Fields.Fields[2].AsString;
    fileName := ExtractFilePath(Application.ExeName) + jcbh;
    ShowMessage('编号=' + jcbh + ' 标志=' + flag + ' 文件名=' + fileName);
    (ADOQuery1.FieldByName('examresult') as TBlobField).SaveToFile(fileName);
    ADOQuery1.Next;
  end;
end;

不过读出的文本是乱码,看不出是什么类型的.不是图片音频等格式, 可能定长记录型的文本

8 楼

非常多谢7楼楼主的回复,下面是我编的代码但运行后所得的数据不是我想要的数据。我想应该是结构体Texam_result_db和Texam_result_db_all定义不对!!有什么办法把数据库中的结构体格式破解出来?????
unit chpas;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ExtCtrls, DBCtrls, ExtDlgs, StdCtrls, ADODB, Mask, ComCtrls,
  Grids_ts, TSGrid;

type
  TForm1 = class(TForm)
    ADODataSet1: TADODataSet;
    Button1: TButton;
    DataSource1: TDataSource;
    DBNavigator1: TDBNavigator;
    Panel2: TPanel;
    tsGrid1: TtsGrid;
    tsGrid2: TtsGrid;
    stBarCZ: TStatusBar;
    GroupBox8: TGroupBox;
    Label23: TLabel;
    Label24: TLabel;
    Label26: TLabel;
    Label27: TLabel;
    Label29: TLabel;
    Label1: TLabel;
    Label22: TLabel;
    Label21: TLabel;
    Label20: TLabel;
    Label19: TLabel;
    Label18: TLabel;
    Label17: TLabel;
    Label16: TLabel;
    Label15: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label2: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label25: TLabel;
    Label28: TLabel;
    DBEdit12: TDBEdit;
    DBEdit14: TDBEdit;
    DBEdit18: TDBEdit;
    DBEdit3: TDBEdit;
    DBEdit11: TDBEdit;
    DBEdit6: TDBEdit;
    DBEdit7: TDBEdit;
    DBEdit8: TDBEdit;
    DBEdit9: TDBEdit;
    DBEdit10: TDBEdit;
    DBEdit17: TDBEdit;
    DBEdit19: TDBEdit;
    DBEdit29: TDBEdit;
    DBEdit28: TDBEdit;
    DBEdit20: TDBEdit;
    DBEdit16: TDBEdit;
    DBEdit22: TDBEdit;
    DBEdit23: TDBEdit;
    DBEdit24: TDBEdit;
    DBEdit25: TDBEdit;
    DBEdit26: TDBEdit;
    DBEdit21: TDBEdit;
    DBEdit30: TDBEdit;
    DBEdit27: TDBEdit;
    DBEdit31: TDBEdit;
    DBEdit15: TDBEdit;
    DBEdit13: TDBEdit;
    DBEdit32: TDBEdit;
    DBEdit1: TDBEdit;
    DBEdit2: TDBEdit;
    DBEdit4: TDBEdit;
    DBEdit5: TDBEdit;
    DateTimePicker11: TDateTimePicker;
    DBEdit33: TDBEdit;
    ADODataSet2: TADODataSet;
    DataSource2: TDataSource;
    DBNavigator2: TDBNavigator;

    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
   
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
type
  Texam_result_db=record
  value:integer;
  times:integer;
  opinion:integer;
end;
type
  Texam_result_db_all=record
   exam_result_db:array[0..79] of Texam_result_db;
   
end;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var
mem:Tmemorystream;
i:integer;
ERDA_swap:Texam_result_db_all;
begin
 adodataset1.Active:=true;
 adodataset2.Active:=true;
 mem:=tmemorystream.Create;
 Tblobfield(adodataset1.FieldByName('examresult')).SaveToStream(mem);
 mem.seek(0,soFromBeginning);
 for i:= 0 to 79 do
    begin
     mem.Read(ERDA_swap,sizeof(ERDA_swap));
    
    end;


  with tsGrid1 do
    begin
       Cell[2,2] := ERDA_swap.Exam_Result_DB[1].value; 

      Cell[3,2] := ERDA_swap.Exam_Result_DB[1].times;

      Cell[4,2] := ERDA_swap.Exam_Result_DB[1].opinion;
 end;//begin
    end; //with

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 adodataset1.Destroy;
 adodataset2.Destroy;
end;




end.

9 楼

请各位高手想办法帮我把长二进制中数据结构显示???
   

 谢谢!!

10 楼

多年中小型项目开发经验,熟悉VB,VBA,Delphi和.NET平台,承接各种软件编写业务,
信誉第一,质量保证,售后完善,如有需要请联系QQ:3 8 3 1 4 7 8 1 8 请注明:pfan

我来回复

您尚未登录,请登录后再回复。点此登录或注册