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

update THETABLE set thefield = ?

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

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

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

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

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

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

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

не работает. PicDialog - открытие файла (диалог).
...
Рейтинг: 0 / 0
05.04.2005, 09:24
    #32997346
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Граждане, помогите
неужели у этого фиелда нет метода loadfromstream?
...
Рейтинг: 0 / 0
05.04.2005, 10:56
    #32997584
Станислав C.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Граждане, помогите
Mizerвот для меня вся проблема и состоит в том, чтобы запихать файл в переменную типа BLOB.
дальше я разберусь.
а как в BLOB толкать файл из TImage - до меня не доходит.
(соответственно - потом вытаскивать).
нужна процедура, которая фозмёт файл из TImage (уже тыза запихнутый)
и загонит его в переменную Blob. А там уже мне всё понятно...
Обрати внимание на:
Из файла в BLOB
Из BLOB в файл
...
Рейтинг: 0 / 0
05.04.2005, 14:05
    #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
05.04.2005, 16:06
    #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
05.04.2005, 16:07
    #32998507
Mizer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Граждане, помогите
Добрался до:

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

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

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

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

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

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

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

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

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

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

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


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