[英]Delphi - Compress TStringList with ZLib and save to SQL VARBINARY column
I need to take the values from a TStringList, compress it using the System.ZLIb libraries and save it to a SQL Server database as a VARBINARY(MAX) column.我需要从 TStringList 中获取值,使用 System.ZLIb 库对其进行压缩,并将其作为 VARBINARY(MAX) 列保存到 SQL 服务器数据库中。
Thus far I have was able to read the compressed data from the SQL table, uncompress it, and load it into a TStringList.到目前为止,我已经能够从 SQL 表中读取压缩数据,将其解压缩并将其加载到 TStringList 中。 However, saving the data back to the database is where my problem lies and I cannot get it to work.
但是,将数据保存回数据库是我的问题所在,我无法让它工作。 According to the Embarcadero docwiki, this should be a very simple process: http://docwiki.embarcadero.com/CodeExamples/Sydney/en/ZLibCompressDecompress_(Delphi)
根据 Embarcadero docwiki,这应该是一个非常简单的过程: http://docwiki.embarcadero.com/CodeExamples/Sydney/en/ZLibCompressDecompress_(Delphi)
Here is the code to update my SQL table.这是更新我的 SQL 表的代码。 When I get to the "CompressedStrm.CopyFrom(InputStream, InputStream.Size);"
当我到达“CompressedStrm.CopyFrom(InputStream, InputStream.Size);” line, I get a "Stream read error" error.
行,我收到“流读取错误”错误。
procedure TdmMain.SaveSystemSetting(SettingName: string; Settings: TStringList);
var
InputStream, OutputStream: TMemoryStream;
CompressedStrm: TCompressionStream;
begin
InputStream:= TMemoryStream.Create;
OutputStream:= TMemoryStream.Create;
try
Settings.SaveToStream(InputStream, TEncoding.Default);
CompressedStrm := TCompressionStream.Create(clDefault, OutputStream);
try
CompressedStrm.CopyFrom(InputStream, InputStream.Size);
OutputStream.SaveToFile('c:\output.zip');
finally
FreeAndNil(CompressedStrm);
end;
{save settings to the database}
qryWork.Close;
qryWork.SQL.Clear;
qryWork.SQL.Add('UPDATE SystemSettings');
qryWork.SQL.Add(' SET Setting = :data');
qryWork.SQL.Add(' WHERE SettingName = ''' + SettingName + '''');
qryWork.Parameters.ParamByName('data').LoadFromStream(OutputStream, ftBlob);
qryWork.ExecSQL;
finally
FreeAndNil(InputStream);
FreeAndNil(OutputStream);
end;
end;
The following code reads from the db, decompress the data and load the TStringList - it works 100%:以下代码从数据库中读取,解压缩数据并加载 TStringList - 它可以 100% 工作:
procedure TdmMain.GetSystemSetting(SettingName: string; var Settings: TStringList);
var
SettingBlob: TBlobField;
DecompStream: TDecompressionStream;
InputStream, OutputStream: TMemoryStream;
begin
qryWork.Close;
qryWork.SQL.Clear;
qryWork.SQL.Add('SELECT Setting');
qryWork.SQL.Add(' FROM SystemSettings');
qryWork.SQL.Add(' WHERE SettingName = ''' + SettingName + '''');
qryWork.Open;
if not qryWork.EOF then
begin
SettingBlob := qryWork.FieldByName('Setting') as TBlobField;
InputStream := TMemoryStream.Create;
OutputStream := TMemoryStream.Create;
try
SettingBlob.SaveToStream(InputStream);
InputStream.Position := 0;
DecompStream := TDecompressionStream.Create(InputStream);
try
OutputStream.CopyFrom(DecompStream, 0);
OutputStream.Position := 0;
Settings.LoadFromStream(OutputStream, TEncoding.Default);
finally
FreeAndNil(DecompStream);
end;
finally
FreeAndNil(InputStream);
FreeAndNil(OutputStream);
end;
end;
qryWork.Close;
end;
Forgot to reposition the input stream...忘记重新定位输入 stream...
try
Settings.SaveToStream(InputStream, TEncoding.Default);
InputStream.Position := 0;
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.