SQL Server записывает .pdf из вставленной таблицы (файловый поток), используя триггер, получая пустые файлы - PullRequest
0 голосов
/ 23 сентября 2019

Я пытаюсь создать TRIGGER ПОСЛЕ INSERT , чтобы записать последний созданный файловый поток в пользовательскую папку

Результат = пустых файлов (0Ko) (изображение прилагается)

Продукт: MSSQL server 2012 sp4 express

    BEGIN

SET NOCOUNT ON;

DECLARE @NameFile VARCHAR(100)
DECLARE @StreamID VARCHAR(200)
DECLARE @SaveDirectory VARCHAR(200)
DECLARE @FileData VARBINARY(MAX)
DECLARE @ObjectToken INT

select @StreamID= i.stream_id, @NameFile = i.name from inserted i

set @FileData=(select file_stream from DocumentFiles where stream_id = @StreamID)
set @SaveDirectory = 'C:\Temp\'+ REPLACE(@NameFile, 'V-FA-', '')

EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT
EXEC sp_OASetProperty @ObjectToken, 'Type', 1
EXEC sp_OAMethod  @ObjectToken, 'Open'
EXEC sp_OAMethod  @ObjectToken, 'Write', NULL,@FileData
EXEC sp_OAMethod  @ObjectToken, 'SaveToFile', NULL, @SaveDirectory, 2
EXEC sp_OAMethod  @ObjectToken, 'Close'
EXEC sp_OADestroy @ObjectToken

END

enter image description here

1 Ответ

0 голосов
/ 23 сентября 2019

sp_OAMethod возвращает значение, которое указывает, было ли действие выполнено без ошибок.Вы можете попытаться отследить проблему, заключив в каждый вызов похожий код:

EXEC  @hr = sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT
        IF @hr <> 0  
            BEGIN  
                    RAISERROR('Error %d ADODB.Stream.', 16, 1, @hr)
                    RETURN
            END
EXEC  @hr = sp_OASetProperty @ObjectToken, 'Type', 1
        IF @hr <> 0  
            BEGIN  
                    RAISERROR('Error %d Type.', 16, 1, @hr)
                    RETURN
            END
EXEC  @hr = sp_OAMethod @ObjectToken, 'Open'
        IF @hr <> 0  
            BEGIN  
                    RAISERROR('Error %d Open.', 16, 1, @hr)
                    RETURN
            END
EXEC  @hr = sp_OAMethod @ObjectToken, 'Write', NULL, @BinaryData
        IF @hr <> 0  
            BEGIN  
                    SET @Error='Error %d Write. '+@SourceName
                    RAISERROR(@Error, 16, 1, @hr)
                    RETURN
            END
EXEC  @hr = sp_OAMethod @ObjectToken, 'SaveToFile', NULL, @FilePath, 2
        IF @hr <> 0  
            BEGIN  
                    RAISERROR('Error %d SaveToFile.', 16, 1, @hr)
                    RETURN
            END
EXEC  @hr = sp_OAMethod @ObjectToken, 'Close'
        IF @hr <> 0  
            BEGIN  
                    RAISERROR('Error %d Close.', 16, 1, @hr)
                    RETURN
            END
EXEC  @hr = sp_OADestroy @ObjectToken
        IF @hr <> 0  
            BEGIN  
                    RAISERROR('Error %d Destroy.', 16, 1, @hr)
                    RETURN
            END
...