我使用的是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是字段类型参数。