使用ADOQuery组件在SQL Server表(varbinary(max) column)中存储文件



我使用的是SQL Server 2019和Delphi 10.3。

我需要在'Personal_Files'表中存储任何类型的文件(如pdf, txt, docx等)。

这个表是由一个文件扩展名(如varchar)的列和一个存储文件本身的varbinary(max)列组成的。

我研究了一下如何把这些文件存储在一个表上,但是没有成功。下面是一些例子:

var
Input,Output: TStream;
FName:        TFileName;
begin
...
//Create Streams and encode Base64:
Input  := TFileStream.Create(FName,fmOpenRead);
Output := TFileStream.Create(FName+'Temp',fmCreate);
TNetEncoding.Base64.Encode(Input,Output);
... // Some validations
// In the ADOQuery component, I did this:
with ADOQuery, sql do
begin
close;
clear;
add('INSERT INTO MyDatabase.dbo.MyFilesTable (EXTENSION,FILEBIN)');
add('VALUES (:wextension, :wfilebin)');
Parameters.ParamByName('wextension').Value := TPath.GetExtension(FName);
Parameters.ParamByName('wfilebin').Value   := Output.toString; 
ExecSQL;
end;

在这个例子中,我试图将流解析为字符串,在编码之后,但是当我在SQL表中查看时,我尝试的所有档案都是相同的流。该参数不接受TStream类型。提前谢谢你。

经过一些研究和一些建议,我找到了一种方法,用ADOQuery将文件发送到我的SQL Server表。虽然,我知道这是不推荐的,所以这只是直接回答我的问题:

只需对代码的最后一部分进行更改就可以回答我的问题(但是,正如问题上的评论,这不是推荐的存储文件的方式):

with ADOQuery, sql do
begin
close;
clear;
add('INSERT INTO MyDatabase.dbo.MyFilesTable (EXTENSION,FILEBIN)');
add('VALUES (:wextension, :wfilebin)');
Parameters.ParamByName('wextension').Value := TPath.GetExtension(FName);
Parameters.Items[1].LoadFromStream(Output,ftVarBytes); 
ExecSQL;
end;

只要改变设置参数的方式,问题就解决了。在这个例子中,使用'LoadFromStream'参数。item [n],其中n是参数索引,它运行得很好。ftVarBytes是字段类型参数。

相关内容

  • 没有找到相关文章

最新更新