主题:长二进制数据
			
 zgs258
				 [专家分:0]  发布于 2008-12-18 09:15:00							
			附件中是ACCESS数据,我想把数据库表exam_result中字段examresult里的长二进制数据记录的数据用dbgrid组件或DBeidt组件逐项显示出来并修改后保存回去,请高手送源码!
						
					 
		
			
回复列表 (共10个回复)
		
								
				沙发
				
					
superth2008 [专家分:0]  发布于 2008-12-21 21:32:00				
				必须要知道长二制数据是什么文件格式。
							 
						
				板凳
				
					
superth2008 [专家分:0]  发布于 2008-12-21 21:36:00				
				必须要先知道长二制数据是什么文件!
							 
						
				3 楼
				
					
zgs258 [专家分:0]  发布于 2008-12-22 14:06:00				
				我也不清楚是什么格式!!!因这个数据库不是我创建的,我自已通过内存流写入的我也能读出来,请高手想办法破解格式,拜托各位了!!
							 
						
				4 楼
				
					
zgs258 [专家分:0]  发布于 2008-12-23 09:09:00				
				
数据库里是一条条记录,我想其数据格式是结构体。
							 
						
				5 楼
				
					
superth2008 [专家分:0]  发布于 2008-12-23 20:54:00				
				数据读出来没有问题,但你如果不知道他的文件格式,你根本不知道用什么应用程序来打开它。如果你自己非要用流的形式然后打开它,肯定是一堆二进制乱码。
							 
						
				6 楼
				
					
zgs258 [专家分:0]  发布于 2008-12-24 09:22:00				
				写入数据的程序是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 楼
				
					
qf095 [专家分:10]  发布于 2008-12-28 20:06:00				
				读二进制数据的代码如下:
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 楼
				
					
zgs258 [专家分:0]  发布于 2008-12-29 14:18:00				
				非常多谢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 楼
				
					
zgs258 [专家分:0]  发布于 2008-12-29 14:22:00				
				请各位高手想办法帮我把长二进制中数据结构显示???
   
 谢谢!!
							 
						
				10 楼
				
					
prof [专家分:90]  发布于 2011-03-09 22:47:00				
				多年中小型项目开发经验,熟悉VB,VBA,Delphi和.NET平台,承接各种软件编写业务,
信誉第一,质量保证,售后完善,如有需要请联系QQ:3 8 3 1 4 7 8 1 8 请注明:pfan
							 
									
			
我来回复