Архив рубрики: OLE, ActiveX

OLE, ActiveX

Как использовать элементы управления ActiveX?

Для вставки в диалог формы элемента управления ActiveX необходимо воспользоваться пунктом главного меню Форма Вставить ActiveX…
В открывшемся диалоге выбора отметим нужный нам объект, например Microsoft Media Player (для прослушивания музыкальных файлов, воспроизведения видеофайлов).

Определим имя элемента управления: WMP.
Кроме этого разместим в диалоге кнопку, при нажатии на которую будет вызываться обработчик события, содержащий приведенный ниже текст:

В указанной процедуре большинство строк кода работают с объектом ДиалогВыбораФайла, позволяющим организовывать удобный диалог выбора файла.
Запуск выбранного файла производится кнопкой Воспроизведение/Play элемента управления WMP.

Как сохранить поле BLOB (image) как файл на диск?

Наиболее эффективно это можно сделать с помощью объектов OLE Automation , работа с которыми осуществляется при помощи:
sp_OACreate, sp_OAGetProperty, sp_OASetProperty, sp_OAMethod, sp_OAGetErrorInfo, sp_OADestroy (подробное описание есть в http://technet.microsoft.com/ru-ru/library/ms203721(sql.90).aspx).
Рабочий пример процедуры (была написана для сохранения zip-архивов, хранящихся в базе):

Код
CREATE PROCEDURE dbo.SaveRequestDataAsFile (
@FileName varchar(1024) —имя файла
,@FilePath varchar(1024) —путь файла
,@ReqID —некое условие на таблицу
)
AS
BEGIN

DECLARE
@Stream integer,
@Buffer varbinary(4096),
@Size integer,
@Pos integer,
@BufSize integer,
@FileNameLocal varchar(1024),
@HR integer

if RIGHT(@FilePath, 1)<>'&# 092;' begin set @FilePath=@FilePath+'&# 092;' end

set @FileNameLocal = @FilePath + @FileName

SET @BufSize = 4096

EXEC @HR = sp_OACreate 'ADODB.Stream',@Stream OUT
if @HR<>0
begin
—обработка ошибки создания объекта
EXEC [dbo].[sp_displayoaerrorinfo] @Stream ,@HR
end

EXEC @HR = sp_OASetProperty @Stream,'Type',1 — binary
EXEC @HR = sp_OASetProperty @Stream,'Mode',3 — write|read
EXEC @HR = sp_OAMethod @Stream,'Open'

S_elect
@Size = DATALENGTH(SrvRequests.RequestData)
FROM SrvRequests WHERE SrvRequests.RequestID = @ReqID

Set @Pos=0

WHILE @Pos < @Size BEGIN
SET @BufSize = CASE WHEN @Size — @Pos < 4096 THEN @Size — @Pos ELSE 4096 END

S_elect @Buffer = substring(SrvRequests.RequestData ,@Pos+1, @BufSize)
from SrvRequests where SrvRequests.RequestID = @ReqID

EXEC @HR = sp_OAMethod @Stream, 'Write', NULL, @Buffer

SET @Pos = @Pos + @BufSize
END

EXEC @HR = sp_OAMethod @Stream,'SaveToFile',null, @FileNameLocal,2
EXEC @HR = sp_OAMethod @Stream,'Close'
EXEC @HR = sp_OADestroy @Stream
END
Рекомендуется создать еще пару процедур для внятного описания ошибок в случае их возникновения

Код
CREATE PROCEDURE sp_hexadecimal
@binvalue varbinary(255),
@hexvalue varchar(255) OUTPUT
AS
DECLARE @charvalue varchar(255)
DECLARE @i int
DECLARE @length int
DECLARE @hexstring char(16)
S_elect @charvalue = '0x'
S_elect @i = 1
S_elect @length = DATALENGTH(@binvalue)
S_elect @hexstring = '0123456789abcdef'
WHILE (@i <= @length)
BEGIN
DECLARE @tempint int
DECLARE @firstint int
DECLARE @secondint int
S_elect @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
S_elect @firstint = FLOOR(@tempint/16)
S_elect @secondint = @tempint — (@firstint* 16)
S_elect @charvalue = @charvalue +
SUBSTRING(@hexstring, @firstint+1, 1) +
SUBSTRING(@hexstring, @secondint+1, 1)
S_elect @i = @i + 1
END
———————————————————————-
CREATE PROCEDURE sp_displayoaerrorinfo
@object int,
@hresult int
AS
DECLARE @output varchar(255)
DECLARE @hrhex char(10)
DECLARE @hr int
DECLARE @source varchar(255)
DECLARE @description varchar(255)
PRINT 'OLE Automation Error Information'
EXEC sp_hexadecimal @hresult, @hrhex OUT
S_elect @output = ' HRESULT: ' + @hrhex
PRINT @output
EXEC @hr = sp_OAGetErrorInfo @object, @source OUT, @description OUT
IF @hr = 0
BEGIN
S_elect @output = ' Source: ' + @source
PRINT @output
S_elect @output = ' Description: ' + @description
PRINT @output
END
ELSE
BEGIN
PRINT ' sp_OAGetErrorInfo failed.'
RETURN
END