Доброї ночі (ранку, дня, вечора)!
Вже стає доброю традицією писати статті пасля 12-ї години ночі. Просто зараз пишу диплом. В процесі написання виникають труднощі, які доводиться вирішувати за допопогою Google. Але якщо я не знаходжу нормальної інформації, а по крихтам її збираю, то народжується ідея нового матеріалу.
Зараз буду писати про те, як зберігати файли в СКБД Oracle за допомогою типу даних: BLOB (Binary Large Object). Програму буду розробляти на C++Builder6 з використанням компонентів ODAC версії 3.90(Oracle Data Access Components). Хоч в них є проблемка: не підтримується Oracle 10g, але цю проблему вирішую просто поставивши клієнт від Oracle 9i (~170 МБ)
Компоненти можна завантажити за цією адресою: http://customz.org.ua/data/odac390cb6net.exe(Клікаєте правою кнопкою й обираєте “Зберегти об’єкт як…”) .
І так, нам знадобиться приблизно така форма:

Потрібно дві кнопки, компоненти OraSession1, OraStoredProc1 з ODAC.
Створюємо таблицю для тестування й втавляємо один рядок:
CREATE TABLE blobTable (
Id NUMBER,
Name VARCHAR2(30),
Value bLOB
);
insert into blobtable(id,name) values(1,'test')
Ще потрібно створити дві процедури на сервері:
CREATE OR REPLACE
PROCEDURE ClobTableUpdate (p_Id NUMBER, p_Name VARCHAR2,
p_Value OUT bLOB)
is
begin
UPDATE blobTable
SET
Name = p_Name,
Value = EMPTY_bLOB()
WHERE
Id = p_Id
RETURNING
Value
INTO
p_Value;
end;
і таку:
CREATE OR REPLACE
PROCEDURE ClobTableGet (p_Id NUMBER, p_Value OUT bLOB)
is
begin
select value
into p_value
from blobtable
where id = p_id;
end;
В коді обробки першої кнопки (Write) пишемо код, який буде записувати в таблицю файл test.rtf, що знаходиться в одному каталозі, що й програма.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString FileName = ExtractFilePath(ParamStr(0))+"\test.rtf";
OraStoredProc1->StoredProcName = "clobTableUpdate"; //назва процедури
OraStoredProc1->Prepare();
OraStoredProc1->ParamByName("p_Id")->AsInteger = 1; //id рядка
OraStoredProc1->ParamByName("p_Name")->AsString ="test";
OraStoredProc1->ParamByName("p_Value")->ParamType = ptInput; //Якщо ptInput - записуємо на сервер
OraStoredProc1->ParamByName("p_Value")->AsBLOBLocator->LoadFromFile(FileName);
OraStoredProc1->Execute();
OraSession1->Commit();
}
Читання файлу з серверу:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
AnsiString FileName = ExtractFilePath(ParamStr(0))+"\savevvv.rtf";
OraStoredProc1->StoredProcName = "clobTableget";
OraStoredProc1->Prepare();
OraStoredProc1->ParamByName("p_Id")->AsInteger = 1;
OraStoredProc1->ParamByName("p_Value")->ParamType = ptOutput;
OraStoredProc1->Execute();
OraStoredProc1->ParamByName("p_Value")->AsBLOBLocator->SaveToFile(FileName);
OraSession1->Commit();
}
Тепер ми записуємо файл з БД в файл savevvv.rtf.
Бажаю успіхів.
Останні коментарі