powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Граждане, помогите
18 сообщений из 18, страница 1 из 1
Граждане, помогите
    #32995053
Mizer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уже взывал к помощи, меня отправляли в раные места. И всё-таки помогите с картинкой:
до меня слабо доходит как закидывать и получать из БД картинку через TBlobField. Смотрел FAQ. Пытался сам. Не получается.
Подкиньте, плиз, кодик как из Image закинуть картинку (все граф форматы, или часть форматов) в процедуру (процедура есть) через параметр типа Blob.
Буду безмерно благодарен.
...
Рейтинг: 0 / 0
Граждане, помогите
    #32995133
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Было-бы неплохо если-бы ты привел фрагмент кода где у тебя "не получатся". Это может ускорить процесс оказания помощи. Иначе народ будет слать тебя в ФАК.
...
Рейтинг: 0 / 0
Граждане, помогите
    #32995400
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В поле типа Image не картинки храняться, а любые бинарные данные большого объема. К картинкам этот тип данных вообще никакого отношения не имеет.
Чтобы туда положить картинку, нужно поместить ее в память а затем выполнить что-то типа

update THETABLE set thefield = ?

а вместо вопроса подставить картинку. Как подставлять - зависит от того, какие средства доступа к СУБД используешь. Возможно, можно будет сбиндить память , содержащую картинку, прамо в бинарном виде, а возможно придется преобразовать в текстовый вид : 0x и далее побайтно , 2 символа на байт , типа 0xaf02344D ....

То же самое примерно будет и при вызове процедуры.
...
Рейтинг: 0 / 0
Граждане, помогите
    #32996715
Mizer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В БД под SQL сервером написана процедура добавления строки в таблицу.
Из билдера через StoredProc задаю параметры. Один из параметров - Blob типа. Как этот параметр задать.
Моя мысль:
1. объявить переменную TBlob...
2. присвойть ей значение файла - закачать туда файл
3. передать параметру процедуры это значения

Как это сделать - ?
...
Рейтинг: 0 / 0
Граждане, помогите
    #32996801
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MizerВ БД под SQL сервером написана процедура добавления строки в таблицу.
Из билдера через StoredProc задаю параметры. Один из параметров - Blob типа. Как этот параметр задать.
Моя мысль:
1. объявить переменную TBlob...
2. присвойть ей значение файла - закачать туда файл
3. передать параметру процедуры это значения

Как это сделать - ?
Подозреваю, что провайдеру БД пофигу какие данные ты пишешь на сервер.
Т.е. приведи код записи в обычное поле test(текстовое) в БД. И от него модифицируешь под запись двоичных данных в поле image_test (image).
...
Рейтинг: 0 / 0
Граждане, помогите
    #32997016
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mizer1. объявить переменную TBlob...
2. присвойть ей значение файла - закачать туда файл
3. передать параметру процедуры это значения
Как это сделать - ?

Мыслишь пральна. Падробностей не знаю.
...
Рейтинг: 0 / 0
Граждане, помогите
    #32997058
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Mizer

Сорцы давай. А то будем играть в угадай-мелодию.
...
Рейтинг: 0 / 0
Граждане, помогите
    #32997222
Mizer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот для меня вся проблема и состоит в том, чтобы запихать файл в переменную типа BLOB.
дальше я разберусь.
а как в BLOB толкать файл из TImage - до меня не доходит.
(соответственно - потом вытаскивать).
нужна процедура, которая фозмёт файл из TImage (уже тыза запихнутый)
и загонит его в переменную Blob. А там уже мне всё понятно...
...
Рейтинг: 0 / 0
Граждане, помогите
    #32997314
Mizer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытался загнить следующее:

Db::TField *field;
TBlobField *blob = (TBlobField *) field;
blob->LoadFromFile(PicDialog->FileName);

не работает. PicDialog - открытие файла (диалог).
...
Рейтинг: 0 / 0
Граждане, помогите
    #32997346
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
неужели у этого фиелда нет метода loadfromstream?
...
Рейтинг: 0 / 0
Граждане, помогите
    #32997584
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mizerвот для меня вся проблема и состоит в том, чтобы запихать файл в переменную типа BLOB.
дальше я разберусь.
а как в BLOB толкать файл из TImage - до меня не доходит.
(соответственно - потом вытаскивать).
нужна процедура, которая фозмёт файл из TImage (уже тыза запихнутый)
и загонит его в переменную Blob. А там уже мне всё понятно...
Обрати внимание на:
Из файла в BLOB
Из BLOB в файл
...
Рейтинг: 0 / 0
Граждане, помогите
    #32998124
Mizer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав C. Mizerвот для меня вся проблема и состоит в том, чтобы запихать файл в переменную типа BLOB.
дальше я разберусь.
а как в BLOB толкать файл из TImage - до меня не доходит.
(соответственно - потом вытаскивать).
нужна процедура, которая фозмёт файл из TImage (уже тыза запихнутый)
и загонит его в переменную Blob. А там уже мне всё понятно...
Обрати внимание на:
Из файла в BLOB
Из BLOB в файл

это чуть не то.

мпне надо:
TMemoryStream *M = new TMemoryStream();
M->LoadFromFile(PicDialog->FileName);
ADO->Parameters->ParamByName("@fg")->Value = M ;
ADO->Open();
чтобы в процедуру передать BLOB переменную
...
Рейтинг: 0 / 0
Граждане, помогите
    #32998506
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогаю

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
//Main.cpp
#include <comutil.h>
#include <io.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <iostream>

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
         no_namespace rename("EOF", "adoEOF")

struct ZC_COMInitialize {
  ZC_COMInitialize(){CoInitialize( 0 ); }
 ~ZC_COMInitialize(){CoUninitialize();}
}; 
ZC_COMInitialize COMInit;

int main(){
/*
use pubs
go

if exists(select * from dbo.sysobjects where id = object_id(N'dbo.utb_Image') and objectproperty(id, N'IsUserTable') = 1)
   drop table dbo.utb_Image
go
create table dbo.utb_Image (
   ID   int identity(1,1) not null
 , BLOB image             not null 
)on [primary] textimage_on [primary]
go
alter table dbo.utb_Image add
constraint pk_utb_Image primary key clustered (ID)on [primary] 
go

if exists(select * from dbo.sysobjects where id = object_id(N'dbo.usp_Image_Save') and objectproperty(id, N'IsProcedure') = 1)
   drop procedure dbo.usp_Image_Save
go
create procedure dbo.usp_Image_Save
   @ID  int out
 , @LEN int
 , @IMG image
as set nocount on
   declare @ret int
   if(@ID <= 0)begin
      insert into dbo.utb_Image (BLOB) values (@IMG)
      set @ID = scope_identity()
   end else begin
      declare @PTR varbinary(16)
      select  @PTR = textptr(BLOB) from dbo.utb_Image where ID = @ID
      updatetext dbo.utb_Image.BLOB @PTR @LEN null @IMG
   end
   select @ret = datalength(BLOB) from dbo.utb_Image where ID = @ID
   return(@ret)
go

if exists(select * from dbo.sysobjects where id = object_id(N'dbo.usp_Image_Read') and objectproperty(id, N'IsProcedure') = 1)
   drop procedure dbo.usp_Image_Read
go
create procedure dbo.usp_Image_Read
   @ID int
as set nocount on
   declare @ptr varbinary(16)
   declare @len int
   declare @siz int
   declare @off int

   select @ptr = textptr(BLOB)
        , @len = datalength(BLOB)
   from dbo.utb_Image where ID = @ID

   set @off = 0
   while(1=1)begin
      select @siz = case when @len > 8000 then 8000 else @len end
      readtext dbo.utb_Image.BLOB @ptr @off @siz
      select @off = @off + @siz
           , @len = @len - @siz
      if(@len <= 0)break
   end
   return(0)
go
*/
  long ret, size, hFile( 0 ); SAFEARRAY  *psa; char HUGEP *ptr; _variant_t v;
  _bstr_t ConnStr = "Provider=SQLOLEDB;       \
                     Data Source=(local);     \
                     Initial Catalog=pubs;    \
                     Integrated Security=SSPI";
  _ConnectionPtr conn;
  try {
    conn.CreateInstance(__uuidof(Connection));
    conn->CursorLocation = adUseServer;
    conn->IsolationLevel = adXactReadCommitted;
    conn->Attributes     =  0 ;
    conn->Open(ConnStr,"","",adConnectUnspecified);

    _CommandPtr cmd;
    cmd.CreateInstance(__uuidof(Command));
    cmd->ActiveConnection = conn;
    cmd->CommandType      = adCmdStoredProc;
    cmd->CommandText      = "dbo.usp_Image_Save";

    ParametersPtr pars = cmd->Parameters;
    pars->Append(cmd->CreateParameter("@RET", adInteger,       adParamReturnValue,  0 ,  0 ));
    pars->Append(cmd->CreateParameter("@ID",  adInteger,       adParamInputOutput,  0 ,  0 ));
    pars->Append(cmd->CreateParameter("@LEN", adInteger,       adParamInput,        0 ,  0 ));
    pars->Append(cmd->CreateParameter("@IMG", adLongVarBinary, adParamInput,        1 ,""));

    /* Save "c:\\winnt\\setupapi.log" */
    hFile = _open("c:\\winnt\\setupapi.log", _O_BINARY | _O_RDONLY, _S_IREAD);
    size = _lseek(hFile,  0 ,  2 ); _lseek(hFile,  0 ,  0 );

    psa = SafeArrayCreateVector(VT_UI1,  0 , size);
    SafeArrayAccessData(psa, (void HUGEP**)&ptr);
    size = _read(hFile, ptr, size);
    SafeArrayUnaccessData(psa);

    v.vt = VT_ARRAY | VT_I1; v.parray = psa;
    pars->Item[1L]->Value =  0 ;
    pars->Item[2L]->Value =  0 ;
    pars->Item[3L]->Size  = size;
    pars->Item[3L]->Value = v;
    cmd->Execute( 0 , 0 ,adOptionUnspecified);

    ret = pars->Item[0L]->Value;
    std::cout << "c:\\winnt\\system32\\oembios.bin" << std::endl;
    std::cout << "Size   = " << size << std::endl;
    std::cout << "Return = " << ret  << std::endl;
    
    SafeArrayDestroy(psa);

    /* Save "c:\\winnt\\driver cache\\i386\\driver.cab" */
    hFile = _open("c:\\winnt\\driver cache\\i386\\driver.cab", _O_BINARY | _O_RDONLY, _S_IREAD);
    size = _lseek(hFile,  0 ,  2 ); _lseek(hFile,  0 ,  0 );
    for(long i( 0 ), id( 0 ), k(size), j = size /  8000 ; i <= j; ++i){
      if(k <=  0 )break;
      psa = SafeArrayCreateVector(VT_UI1,  0 , (k> 8000 )? 8000 :k);
      SafeArrayAccessData(psa, (void HUGEP**)&ptr);
      size = _read(hFile, ptr,  8000 );
      SafeArrayUnaccessData(psa);

      v.vt = VT_ARRAY | VT_I1; v.parray = psa;
      if(size > 0L){
        pars->Item[1L]->Value = id;
        pars->Item[2L]->Value = i* 8000 ;
        pars->Item[3L]->Size  = size;
        pars->Item[3L]->Value = v;
        cmd->Execute( 0 , 0 ,adOptionUnspecified);

        ret = pars->Item[0L]->Value;
        id  = pars->Item[1L]->Value;
        std::cout << "c:\\winnt\\driver cache\\i386\\driver.cab" << std::endl;
        std::cout << "Size   = " << size << std::endl;
        std::cout << "Return = " << ret  << std::endl;
      }
      SafeArrayDestroy(psa);
      k -=  8000 ;
    }

    /* Read driver.cab */
    if(hFile >  0 )_close(hFile);
    hFile = _open("c:\\temp\\driver.cab.img", _O_BINARY | _O_CREAT | _O_TRUNC |_O_WRONLY,_S_IWRITE);

    cmd->CommandType = adCmdText;
    cmd->CommandText = "exec dbo.usp_Image_Read 2";
    while( pars->Count >  0  )pars->Delete(0L);
    _RecordsetPtr rs = cmd->Execute( 0 , 0 ,adOptionUnspecified);

    if(rs){while(true){if(!rs->adoEOF){
        v = rs->Fields->Item[0L]->Value; 
        psa = v.parray;
        SafeArrayAccessData(psa, (void HUGEP**)&ptr);
        _write(hFile, ptr, psa->rgsabound->cElements);
        SafeArrayUnaccessData(psa);
      }if((rs = rs->NextRecordset( 0 ))== 0 )break;
    } }
  }catch(_com_error &e){
    std::cerr << " Error " << (const char*)e.Description() << std::endl;
  }
  if(hFile >  0 )_close(hFile);
  return  0 ;
}
...
Рейтинг: 0 / 0
Граждане, помогите
    #32998507
Mizer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрался до:

TMemoryStream *M = new TMemoryStream();
M->LoadFromFile(PicDialog->FileName);
AD->Parameters->ParamByName("@fg")->LoadFromStream(M,ftBlob);
AD->ExecProc();

на последней строке ругается :
"Ошибка синтаксиса или нарушение прав доступа."
...
Рейтинг: 0 / 0
Граждане, помогите
    #32998976
Mizer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё 1 дохлый вариант:

TBlobField *MyField = new TBlobField(NULL);
MyField->LoadFromFile(PicDialog->FileName);

что делаю не так, как следовало бы?
...
Рейтинг: 0 / 0
Граждане, помогите
    #32999223
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ты по ссылкам принципиально не ходишь ?

http://]http://www.sql.ru/faq/faq_topic.aspx?fid=334
...
Рейтинг: 0 / 0
Граждане, помогите
    #32999370
Mizer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lepsikты по ссылкам принципиально не ходишь ?

http://]http://www.sql.ru/faq/faq_topic.aspx?fid=334

Этот вариант я понимаю, НО...

Мне надо передать BLOB в качестве параметра процедуры - в этом вся загвоздка и есть.
Мне не надо работы прямой записи, мне надо через ПРОЦЕДУРУ. Всё загружаю/выгружаю из переменной BLOB, но передать значение в процедуру не получается. Выскакивает ошибка. (см. выше)
...
Рейтинг: 0 / 0
Граждане, помогите
    #33000862
Mizer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПОБЕДА !

в параметр из процедуру гружу через ...->Parameters->LoadFromFile(...)

вытаскиваю через пример кода от Lepsik - класный пример.

ОДНО НО !
не пойму как TImage работает с форматами файлов.
Если был загружен BMP то JPEG грузить не хочет.
Как с этим бороться, пока не знаю.
Но всё-равно, всем спасиба !
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Граждане, помогите
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]