2016-01-20 18 views
0

我想將一些TStringStreams連接成一個流。連接TStringStream

我在SQL Server中有一些blob(varbinary(max))字段,而且我想從所有行創建一個流,然後將其保存到文件中。

var 
    // MSWord: Variant; 
    i: Int32; 
    sA: TStringStream; 
    sP: TStringStream; 
    s: TStringStream; 
    // fString: TStrings; 
begin 
    sA := TStringStream.Create; 
    s := TStringStream.Create; 
    sP := TStringStream.Create; 
    try 
    with DateED do 
    begin 
     BlobField.SaveToStream(sA); 
     sA.SaveToStream(s); 
     // s.CopyFrom(sA, sA.Size); 
     // s.LoadFromStream(sA); 
     s.Position := sA.Size; 
    end; 
    with DateED.spED_TemplateParagraf do 
    begin 
     First; 
     while not EOF do 
     begin 
     DateED.BlobField.SaveToStream(sP); 
     sP.SaveToStream(s); 
     s.Position := sP.Size; 
     sP.Clear; 
     Next; 
     end; 
    end; 
    s.SaveToFile('D:\test.doc'); 
    finally 
    sA.Free; 
    s.Free; 
    sP.Free; 
    end; 

由於某種原因,這並不能解決問題,任何人都可以幫我提出建議嗎?我如何連接我的Blob字段?

編輯

所以試圖大衛的解決方案

procedure CopyBlobFieldToStream(ds: TDataSet; field: TBlobField; outputStream: TStream); 
    var 
     inputStream: TStream; 
    begin 
     inputStream := ds.CreateBlobStream(field, bmRead); 
     try 
     outputStream.CopyFrom(inputStream, inputStream.Size); 
     finally 
     inputStream.Free; 
     end; 
    end; 

    .... 

    stream := TFileStream.Create(fileName, fmCreate); 
    try 
     CopyBlobFieldToStream(ds, field1, stream); 
     CopyBlobFieldToStream(ds, field2, stream); 
    finally 
     stream.Free; 
    end; 

我仍然無法找到所有的領域的信息到

var 
    i: Int32; 
    stream: TFileStream; 
    Path1: string; 
    WordApp: TWordApplication; 
begin 
    Path1 := IncludeTrailingPathDelimiter(GetEnvironmentVariable('TEMP')) + 
    FormatDateTime('yyyymmddhhnnssz', Now) + '.doc'; 
    WordApp := TWordApplication.Create(nil); 
    stream := TFileStream.Create(Path1, fmCreate); 
    try 
    try 
     with dm do 
     begin 
     DataSet.First; 
     CopyBlobFieldToStream(dm.DataSet, 
      dm.DataSetBlobField, stream); 
     ShowMessage(IntToStr(stream.Size)); 
     DataSet.Next; 
     CopyBlobFieldToStream(dm.DataSet, 
      dm.DataSetBlobField, stream); 
     ShowMessage(IntToStr(stream.Size)); 
     CopyBlobFieldToStream(dm.DataSet2, 
      dm.DataSet2BlobField, stream); 
     ShowMessage(IntToStr(stream.Size)); 
     end; 
    finally 
     stream.Free; 
    end; 
    WordApp.Documents.Open(Path1, EmptyParam, False, EmptyParam, EmptyParam, 
     EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, 
     EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam); 
    WordApp.Visible := True; 
    finally 
    WordApp.Free; 
    end; 

後,這就是我所說的方式,但在Word碼頭中,我只能從第一個blob字段中找到文本,但實際上流的大小正在增加。

+0

你爲什麼儲蓄ANSI文本到你的數據庫?如果您使用文本進行操作,那麼使用字符串處理它不容易嗎?爲什麼你使用字符串流呢?爲什麼要將ANSI文本存儲在二進制BLOB中? –

+0

我的Blob字段實際上是一些單詞文檔。 – CiucaS

+0

二進制BIFF8文件呢?當然不是適合用於字符串流的東西。這是二進制數據。不是文字。 –

回答

1

字符串流是作業的錯誤工具。你沒有文字,你有二進制數據。您只是想要連接兩個二進制BLOB。做到這一點與代碼的東西沿着這些路線:

procedure ConcatenateBlobField(ds: TDataSet; field1, field2: TBlobField; outputStream: TStream); 
var 
    inputStream: TStream; 
begin 
    inputStream := ds.CreateBlobStream(field1, bmRead); 
    try 
    outputStream.CopyFrom(inputStream, inputStream.Size); 
    finally 
    inputStream.Free; 
    end; 

    inputStream := ds.CreateBlobStream(field2, bmRead); 
    try 
    outputStream.CopyFrom(inputStream, inputStream.Size); 
    finally 
    inputStream.Free; 
    end; 
end; 

爲了保存到一個文件,創建一個TFileStream並把它傳遞給函數。

stream := TFileStream.Create(fileName, fmCreate); 
try 
    ConcatenateBlobFields(ds, field1, field2, stream); 
finally 
    stream.Free; 
end; 

或許是這樣的:

procedure CopyBlobFieldToStream(ds: TDataSet; field: TBlobField; outputStream: TStream); 
var 
    inputStream: TStream; 
begin 
    inputStream := ds.CreateBlobStream(field, bmRead); 
    try 
    outputStream.CopyFrom(inputStream, inputStream.Size); 
    finally 
    inputStream.Free; 
    end; 
end; 

.... 

stream := TFileStream.Create(fileName, fmCreate); 
try 
    CopyBlobFieldToStream(ds, field1, stream); 
    CopyBlobFieldToStream(ds, field2, stream); 
finally 
    stream.Free; 
end; 
+0

TStream不會讓我SaveToFile的內容。 – CiucaS

+0

好吧,我以爲你想將兩個BLOB連接到第三個BLOB。您想要將兩個BLOB寫入流中。我的更新是這樣做的。 –

+0

東西不工作...流輸出只是在第一個Blob字段中。無論如何謝謝你的嘗試。 – CiucaS