Есть база MS SQL Server2012, пишу в RAD XE3.
Нужна подсказка, возможно ли это реализовать...
До сих пор делал вставку рисунков в базу через цикл в самой программе.
А хочу передавать в SQL-запрос массив (список, структуру - не знаю даже как правильно назвать) данных,
и обрабатывать уже в SQL-запросе.
Вот пример, если один обьект-рисунок:
TMemoryStream *Stream_Image=new TMemoryStream;
TImage *image = (TImage *) RzFlowPanel1->Components[0];
image->Picture->Graphic->SaveToStream(Stream_Image) ;
Stream_Image->Position = 0;
ADOQuery->Parameters->ParamByName("name_image")->Value = RzEdit3->Text +"_" + IntToStr(i)+".jpeg";
ADOQuery->Parameters->ParamByName("file_stream")->LoadFromStream(Stream_Image, ftBlob);
ADOQuery->Prepared = true;
ADOQuery->ExecSQL();
Вот так обрабатываю в запросе:
DECLARE @name_image_ nvarchar(255)
DECLARE @file_stream_ varbinary(MAX)
DECLARE @stream_id_ uniqueidentifier
SET @name_image_ = :name_image
SET @file_stream_ = :file_stream
DECLARE @Temp TABLE (stream_id2 uniqueidentifier)
DECLARE @path HIERARCHYID
DECLARE @new_path VARCHAR(675)
SELECT @path = path_locator
FROM dbo.Pictures
WHERE name = 'Films'
SELECT @new_path = @path.ToString() +
CONVERT(VARCHAR(20), CONVERT(BIGINT, SUBSTRING(CONVERT(BINARY(16), NEWID()), 1, 6))) + '.' +
CONVERT(VARCHAR(20), CONVERT(BIGINT, SUBSTRING(CONVERT(BINARY(16), NEWID()), 7, 6))) + '.' +
CONVERT(VARCHAR(20), CONVERT(BIGINT, SUBSTRING(CONVERT(BINARY(16), NEWID()), 13, 4))) + '/'
IF EXISTS ( SELECT emty_base.dbo.Pictures.name
FROM emty_base.dbo.Pictures WHERE emty_base.dbo.Pictures.name = @name_image_ )
BEGIN
SELECT @stream_id_ = emty_base.dbo.Pictures.stream_id
FROM emty_base.dbo.Pictures WHERE emty_base.dbo.Pictures.name = @name_image_
/* сохранает базу emty_base.dbo.image */
INSERT INTO emty_base.dbo.image (stream_id, film_id)
VALUES (@stream_id_, @ID_FILM )
END
ELSE
BEGIN
INSERT INTO emty_base.dbo.Pictures (name, file_stream, path_locator)
OUTPUT inserted.stream_id INTO @Temp
VALUES (@name_image_, @file_stream_, @new_path)
SELECT @stream_id_ = stream_id2 FROM @Temp
/* сохраняет в базу emty_base.dbo.image */
INSERT INTO emty_base.dbo.image (stream_id, film_id)
VALUES (@stream_id_, @ID_FILM)
END
Потому как, если использую текстовые или цифровые данные, проблем не возникает - просто формирую
строку с заданым разделителем; передаю в запрос, а там, используя функцию,
формирую масив в виде табличной переменной, а дальше уже дело техники:
/* разбивает строку на компоненты по заданому розделителю */
IF OBJECT_ID (N'dbo.ListArray', N'TF') IS NOT NULL
DROP FUNCTION dbo.ListArray;
CREATE FUNCTION dbo.ListArray (@StrValue nvarchar(4000) , @Delimiter nvarchar(1) )
RETURNS @T_ganr TABLE (id_list INT, name nvarchar(30))
AS
BEGIN
DECLARE @StartLoc INT, @EndLoc INT =1, @id_ch INT = 1
IF LEN(@StrValue) > 0
BEGIN
SET @StartLoc = 1
WHILE @EndLoc 0
BEGIN
SET @EndLoc = CHARINDEX(@Delimiter, @StrValue, @StartLoc)
IF @EndLoc 0
INSERT INTO @T_ganr (id_list ,[name]) VALUES ( @id_ch , LTRIM(RTRIM(SUBSTRING(@StrValue, @StartLoc, @EndLoc - @StartLoc))) )
SET @StartLoc = @EndLoc + LEN(@Delimiter)
SET @id_ch = @id_ch + 1
END
END
RETURN
END
А вот как работать с двоичными данными не знаю...