Jun 29

Как сохранять файлы в СУБД Oracle с помощью BLOB?

Давайте посмотрим, как нужно сохранить файлы в СУБД Oracle с помощью типа данных Binary Large Object... Саму программу делать будем на C++Builder6 с использованием компонентов ODAC версии 3.90. Хотя при работе с данными компонентами мы столкнемся с проблемкой – не поддерживается Oracle 10g, Но эту проблемку достаточно легко решить с помощью клиента от Oracle 9i.

Нам необходима будет приблизительно такая форма:


Нужны 2 кнопки, компоненты OraStoredProc1, OraSession1 из 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.


Поделитесь вашими мыслями



Ссылки в комментариях будут свободны от nofollow.

Поддерживаемые теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

Ссылки в комментариях будут свободны от nofollow.