C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: как передать в запрос массив данных (двоичных)  (Прочитано 1106 раз)
direk
Участник


Сказали спасибо: +6/-0
Offline

Сообщений: 79


как передать в запрос массив данных (двоичных)
« : 29 Ноябрь 2015, 18:45:26 »

Есть база 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

А вот как работать с двоичными данными не знаю...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.097 секунд. Запросов: 19.