TMemoryStreamをBLOBBフィールドに格納し、Accuracer DB/SQLを使用してそこから読み取るにはどうすればよいですか。SQLとは、ABSQueryを意味します。
ありがとう
TMemoryStreamをBLOBBフィールドに格納し、Accuracer DB/SQLを使用してそこから読み取るにはどうすればよいですか。SQLとは、ABSQueryを意味します。
ありがとう
BLOBフィールドのドキュメントにその方法が示されています。そこにあるコードは、ファイルを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;
次の例では、メモフィールドから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;
ここから:
あなたの質問は私にはあまり明確ではありません(そして答えとあなたのコメントを見ると、それは他のすべてと同じです)。だからこれは暗闇の中でのショットです...
Absolute DatabaseにはMimeToBin
、MIMEエンコード(文字列)値をバイナリデータ型に変換する変換機能があります。
サンプルMimeToBin
(サンプルデータはHello World
)
INSERT INTO table ( BinData )
VALUES ( MimeToBin( 'SGVsbG8gV29ybGQ=' ) )
Base64
ストリームからそのようなエンコードされた文字列を取得するには、を使用しますABSDecUtil.TStringFormat_MIME64
。
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;
これはすべてほんの少し抽象的なものなので、ComponentAceからサンプルプロジェクトを入手できます。