主题:长二进制数据
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
我来回复