首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自BLOB的ReadWrite TMemoryStream

来自BLOB的ReadWrite TMemoryStream
EN

Stack Overflow用户
提问于 2013-03-14 23:10:39
回答 3查看 5.3K关注 0票数 1

如何使用Accuracer DB / SQL将TMemoryStream存储到BLOBB字段并从中读取。说到SQL,我指的是ABSQuery。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-15 06:40:56

你的问题对我来说不是很清楚(看一下答案和你的评论,其他人都是一样的)。所以这只是一种胡思乱想...

绝对数据库有一个转换函数MimeToBin,用于将MIME编码(字符串)值转换为二进制数据类型。

MimeToBin示例(示例数据仅为Hello World)

代码语言:javascript
复制
INSERT INTO table ( BinData )
VALUES ( MimeToBin( 'SGVsbG8gV29ybGQ=' ) )

要从流中获取这样的Base64编码字符串,请使用ABSDecUtil.TStringFormat_MIME64

代码语言:javascript
复制
uses
  ABSDecUtil; 

function BuildSQLFromStream( AStream : TMemoryStream ) : string;
var
  LCoder : TStringFormat_MIME64;
begin
  LCoder := TStringFormat_MIME64.Create;
  try
    RESULT := 
      'INSERT INTO table ( BinData ) ' +
      'VALUES( MimeToBin( ' + 
      QuotedStr( 
        LCoder.StrTo( 
          AStream.Memory, 
          AStream.Size ) ) + 
      ' ) )';
  finally
    LCoder.Free;
  end;
end;

因为这一切都有点抽象,所以您可以获得一个sample project from Component Ace

票数 0
EN

Stack Overflow用户

发布于 2013-03-15 00:31:50

The documentation for BLOB fields将向您展示如何操作。其中的代码演示了如何将文件存储到BLOB字段中,但您可以对其进行调整,以存储任何类型的流的内容,而不仅仅是TFileStream。关键是创建一个BLOB流,然后调用CopyFrom,它将一个流的内容复制到另一个流中。

代码语言:javascript
复制
ABSTable1.Edit;
try
  BlobStream := ABSTable1.CreateBlobStream(Field, bmWrite) as TABSBlobStream;
  try
    BlobStream.CopyFrom(Stream, 0);
  finally
    BlobStream.Free;
  end;
  ABSTable1.Post;
except
  ABSTable1.Cancel;
  raise;
end;
票数 1
EN

Stack Overflow用户

发布于 2013-03-14 23:21:21

下面的示例将memo字段中的数据读入blob流,并在memo控件中显示该数据。

代码语言:javascript
复制
procedure TForm1.Button2Click(Sender: TObject);
var
Buffer: PChar;
MemSize: Integer;
Stream: TACRBlobStream;
begin
Stream := TACRBlobStream.Create(MyAccuracer.FieldByName('Notes') as TBlobField, bmRead);
try
MemSize := Stream.Size;
Inc(MemSize); //Make room for the buffer's null terminator.
Buffer := AllocMem(MemSize); //Allocate the memory.
try
Stream.Read(Buffer^, MemSize); //Read Notes field into buffer.
Memo1.SetTextBuf(Buffer);// Display the buffer's contents.
finally
FreeMem(Buffer, MemSize);
end;
finally
Stream.Free;
end;
end; 

从这里开始:

http://www.aidaim.com/products/acr/guide_bde_alternative_client-server_single-file_embedded_bde_replacement_database_delphi_c++builder_kylix/blob_fields_use.php

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15413008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档