2013-03-14 123 views
0

如何将TMemoryStream存储到BLOBB字段并使用Accuracer DB/SQL从中读取。与SQL我的意思是ABSQuery ..从BLOB读取写入TMemoryStream

由于

+0

您是否尝试过做['这个way'(http://www.scalabium.com/faq/dct0141 .htm)? – TLama 2013-03-14 15:12:02

+0

@TLama不是真的SQL:p – user299323 2013-03-14 15:33:10

+0

我不知道你的意思,但你甚至试图将该代码翻译成['像这样'](http://pastebin.com/WVM6vqy6)?我敢打赌,大多数数据库组件供应商使用通用的Delphi DB类祖先。 – TLama 2013-03-14 15:50:09

回答

0

你的问题我不太清楚(看着答案,您的意见是相同的所有其他)。所以这只是在黑暗中拍摄...

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

样品为MimeToBin(样本数据是刚刚Hello World

INSERT INTO table (BinData) 
VALUES (MimeToBin('SGVsbG8gV29ybGQ=')) 

为了得到这样从流使用ABSDecUtil.TStringFormat_MIME64一个Base64编码的字符串。

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

就这样! :) – user299323 2013-03-14 22:47:49

0

下面的示例从一个备忘录字段中的数据读入一个blob流,并将其显示在备忘录控件。

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

TACRBlobStream已定义? – user299323 2013-03-14 15:31:23

+0

它在['ACRMain'](http://www.aidaim.com/products/acr/ref_cross-platform_client-server_single-file_embedded_bde_replacement_database_sql_delphi_c++builder_kylix/tsqlmemblobstream.php)单元中。 – TLama 2013-03-14 15:33:20

+0

@TLama不会使用ABSQuery .. – user299323 2013-03-14 15:40:49

1

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

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; 
+0

我不使用ABSTable,而是使用ABSQuery :)这不会起作用 – user299323 2013-03-14 16:34:24

+0

@RobKennedy:您可以通过将BlobStream声明为通用的'TStream'来摆脱类型转换专门用来代替“TABSBlobStream”。 'CreateBlobStream()'返回一个通用的'TStream'指针,这个代码没有使用任何'TABSBlobStream'特定的功能。 – 2013-03-14 20:34:09

+0

@ user2153148:尝试'Field.DataSet.CreateBlobStream(Field,...)';' – 2013-03-14 20:37:19