Delphi如何读取Access数据库长二进制字段?

夏夜虫飞 2018-05-23 11:38:24
Access数据库中有一个字段是长二进制字段,大小是8个字节,里面存储两个float数,请各位大神指导下,如何将二进制数据读读取出来。

分不多,敬请见谅!
...全文
674 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
liups 2018-05-23
  • 打赏
  • 举报
回复
为什么不修改库结构呢?
夏夜虫飞 2018-05-23
  • 打赏
  • 举报
回复
引用 9 楼 wdonghai 的回复:
procedure TForm1.Button1Click(Sender: TObject); var ms:TMemoryStream; data:array[0..1] of single; begin if AQData.FieldByName('全血粘度数据').IsNull then exit; ms:=TmemoryStream.Create; try (AQData.FieldByName('全血粘度数据') as TBlobField).SaveToStream(ms); ms.Position:=0; ms.ReadBuffer(data[0],sizeof(data)); showmessage(floattostr(data[0])); showmessage(floattostr(data[1])); finally ms.Free; end; end;
非常感谢!
夏夜虫飞 2018-05-23
  • 打赏
  • 举报
回复
引用 8 楼 DelphiGuy 的回复:
把github当网盘使用也是一大创新,会不会导致国内把github封了内...
wdonghai 2018-05-23
  • 打赏
  • 举报
回复
procedure TForm1.Button1Click(Sender: TObject); var ms:TMemoryStream; data:array[0..1] of single; begin if AQData.FieldByName('全血粘度数据').IsNull then exit; ms:=TmemoryStream.Create; try (AQData.FieldByName('全血粘度数据') as TBlobField).SaveToStream(ms); ms.Position:=0; ms.ReadBuffer(data[0],sizeof(data)); showmessage(floattostr(data[0])); showmessage(floattostr(data[1])); finally ms.Free; end; end;
夏夜虫飞 2018-05-23
  • 打赏
  • 举报
回复
引用 5 楼 hj3000 的回复:
字段 SaveToStream 到 TMemoryStream,然后 Read两次。 只要知道内容的结构就好办。
我是这么写的。 procedure TForm1.Button2Click(Sender: TObject); var AStream: TMemoryStream; AStream2: TStream; AStrStream: TStringStream; bytVal: array of Byte; lsItm_Vol: string; function StreamToString(mStream: TStream): string; { 将内存流转换成字符串 } var I: Integer; begin Result := ''; if not Assigned(mStream) then Exit; SetLength(Result, mStream.Size); for I := 0 to Pred(mStream.Size) do try mStream.Position := I; mStream.Read(Result[Succ(I)], 1); except Result := ''; end; end; function StreamToString2(const Stm: TStream): string; var SS: TStringStream; // used to copy stream to string begin SS := Classes.TStringStream.Create(''); try // Copy given stream to string stream and return value SS.CopyFrom(Stm, 0); Result := SS.DataString; finally SS.Free; end; end; begin if Edit1.Text = '' then Exit; AStream := TMemoryStream.Create; AStream2 := TStream.Create; AStrStream := TStringStream.Create(''); try ADOQuery1.ConnectionString := FConStr; ADOQuery1.Active := True; ADOQuery1.First; while not ADOQuery1.Eof do begin AStream.Clear; TBlobField(ADOQuery1.FieldByName('全血粘度数据')).SaveToStream(AStream); if AStream.Size = 0 then continue; SetLength(bytVal, AStream.Size); AStream.Position := 0; AStream.Read(bytVal[0], AStream.Size); lsItm_Vol := Chr(bytVal[0]) + Chr(bytVal[1]); WriteLog(lsItm_Vol + #13); Memo1.Lines.Add(lsItm_Vol); lsItm_Vol := StreamToString(AStream); WriteLog(lsItm_Vol + #13); Memo1.Lines.Add(lsItm_Vol); lsItm_Vol := StreamToString2(AStream); WriteLog(lsItm_Vol + #13); Memo1.Lines.Add(lsItm_Vol); ADOQuery1.Next; end; finally FreeAndNil(AStream); FreeAndNil(AStream2); FreeAndNil(AStrStream); end; end;
  • 打赏
  • 举报
回复
把github当网盘使用也是一大创新,会不会导致国内把github封了内...
liups 2018-05-23
  • 打赏
  • 举报
回复
引用 3 楼 ly379616775 的回复:
我现在是想读出来,但是读出来有问题,数据库路径:https://github.com/ly379616775/New,文件是Data2.mdb
这么说你的标题就不对了! 你得要搞清楚人家是以什么格式存储的,然后就能读取了
  • 打赏
  • 举报
回复
标准方法是使用TBlobStream来访问Blob字段,如果你感觉繁琐的话,也可以hacking一下: type TFloat2 = record case integer of 0: (LargeInt: Int64); 1: (Float1, Float2: single); end; var F2: TFloat2; 使用: F2.LargeInt := TBlobField(xxx.FieldByName('...')).AsLargeInt; 然后就可以使用F2.Float1、F2.Float2了。 不过这种方法不保证对所有数据库兼容。
hj8090 2018-05-23
  • 打赏
  • 举报
回复
字段 SaveToStream 到 TMemoryStream,然后 Read两次。 只要知道内容的结构就好办。
夏夜虫飞 2018-05-23
  • 打赏
  • 举报
回复
我现在是想读出来,但是读出来有问题,数据库路径:https://github.com/ly379616775/New,文件是Data2.mdb
夏夜虫飞 2018-05-23
  • 打赏
  • 举报
回复
引用 1 楼 liups 的回复:
为什么不修改库结构呢?
这个是别人的数据库,我只能读,不能改。
liups 2018-05-23
  • 打赏
  • 举报
回复
如果实在不改,大约可以这样: 参照write函数什么的,把两个float写入文件(流),然后BLOB保存流,读取时相反。

2,498

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧