Hallo,
Ich habe das ganze nun so gelöst:
Zunächst der Delphi Code:
Delphi-Quellcode:
ADOStoredProc1.Close;
ADOStoredProc1.Parameters.Clear;
ADOStoredProc1.ProcedureName := 'dbo.GetFile';
ADOStoredProc1.Parameters.AddParameter.Name := '@ID';
ADOStoredProc1.Parameters.ParamByName('@ID').DataType := ftInteger;
ADOStoredProc1.Parameters.ParamByName('@ID').Direction := pdInput;
ADOStoredProc1.Parameters.ParamByName('@ID').Size := MaxInt;
ADOStoredProc1.Parameters.ParamByName('@ID').Value := ID;
ADOStoredProc1.Open;
// speichern
JvSaveDialog1.FileName := ExtractFileName(ADOStoredProc1.fields.FieldByName('FileName').Value);
if JvSaveDialog1.Execute = True then
begin
TBlobField(ADOStoredProc1.fields.FieldByName('BinaryData')).SaveToFile(JvSaveDialog1.FileName);
end;
Wie man sieht, greife ich nun auf das Ergebnis per Recordset zu, welches ich am Ende der SP herausgebe:
SQL-Code:
CREATE PROCEDURE GetFile (
@ID int)
AS
BEGIN
DECLARE @fstream varbinary(max);
DECLARE @fname varchar(50);
DECLARE @path_to_fname varchar(1000);
DECLARE @updatequery varchar(2000)
SET @path_to_fname = 'D:\temp2\myDBFolder\';
-- prüfen, ob fstream geladen werden muss
SELECT @fstream = fstream FROM FileTable WHERE ID=@ID;
IF @fstream IS NULL
BEGIN
-- OPENROWSET unterstützt keine variablen, daher der umweg:
SELECT @fname = fname FROM FileTable WHERE ID = @ID;
SET @updatequery = '
UPDATE FileTable
SET fstream = (SELECT * FROM OPENROWSET(BULK ''' + @path_to_fname + @fname + ''', SINGLE_BLOB) AS x)
WHERE ID='+ @ID +';';
--print @updatequery;
EXEC (@updatequery);
END;
SELECT @fstream = fstream, @fname = fname FROM FileTable WHERE ID=@ID;
SELECT @fstream as BinaryData, @fname as FileName;
END
Falls jemand interessiert ist, ich habe auch noch Code für das abspeichern einer Clientdatei auf dem Server...
Gruß,
Jan