ورود

View Full Version : آموزش: افزودن تصاویر به پایگاه داده اوراکل



رسول_57
یک شنبه 21 اردیبهشت 1393, 22:43 عصر
سوال : می خواهیم در کنار ذخیره سازی اطلاعات ، تصاویر مرتبط با آن را نیز ذخیره کنیم . چگونه می توان این کار را انجام داد . آیا اصلا امکانپذیر است ؟ در ضمن می خواهم تصاویر را به صورت Clob ذخیره کنم . از چه کدی برای این کار استفاده کنم ؟

پاسخ : اولین مرحله ایجاد یک دایرکتوری در اوراکل و مپ کردن آن به فولدری است که تصاویر در آن قرار دارد ، با استفاده از کد زیر :
create directory image_dir as 'c:\image_dir';
سپس باید از پروسیژری برای وارد کردن تصاویر در جدول استفاده کنید . ابتدا جدولی که می خواهید تصاویر را در آن ذخیره کنید طراحی کنید . دقت کنید که از نوع داده Blob برای ذخیره اطلاعات استفاده می کنیم . از کد زیر برای این کار استفاده کنید :

CREATE TABLE test_image (
ID NUMBER,
image_filename VARCHAR2(50),
image BLOB );
حالا از پروسیژر زیر برای وارد کردن تصاویر در جدول فوق استفاده کنید :

CREATE OR REPLACE PROCEDURE insert_image_file (p_id NUMBER, p_image_name IN VARCHAR2)IS
src_file BFILE;
dst_file BLOB;
lgh_file BINARY_INTEGER;
BEGIN
src_file := BFILENAME ('image_DIR', p_image_name);

-- insert a NULL record to lock
INSERT INTO temp_image
(ID, image_name, image
)
VALUES (p_id, p_image_name, EMPTY_BLOB ()
)
RETURNING image
INTO dst_file;

-- lock record
SELECT image
INTO dst_file
FROM temp_image
WHERE ID = p_id AND image_name = p_image_name
FOR UPDATE;

-- open the file
DBMS_LOB.fileopen (src_file, DBMS_LOB.file_readonly);
-- determine length
lgh_file := DBMS_LOB.getlength (src_file);
-- read the file
DBMS_LOB.loadfromfile (dst_file, src_file, lgh_file);

-- update the blob field
UPDATE temp_image
SET image = dst_file
WHERE ID = p_id AND image_name = p_image_name;

-- close file
DBMS_LOB.fileclose (src_file); END insert_image_file;

حالا پروسیژر را برای وارد کردن تصاویر به صورت زیر اجرا کنید :

EXECUTE insert_image_file(1,'test_image.jpg');

babila
دوشنبه 26 خرداد 1393, 11:16 صبح
این هم کد C# برای این کار


public bool InsertFileInOracleTable(int ID, string I_FILE_PATH)
{
bool res = false;
OracleConnection con = new OracleConnection(conStr);
String SourceLoc = I_FILE_PATH;
FileStream fs = new FileStream(SourceLoc, FileMode.Open, FileAccess.Read);


try
{

byte[] ImageData = new byte[fs.Length];
fs.Read(ImageData, 0, System.Convert.ToInt32(fs.Length));
fs.Close();

String block = " BEGIN " +
" INSERT INTO TBL_IMAGE (ID, IMAGE_FILE) VALUES (:1, :2); " +
" END; ";

OracleCommand cmd = new OracleCommand();
cmd.CommandText = block;
cmd.Connection = con;

cmd.CommandType = CommandType.Text;

OracleParameter param1 = cmd.Parameters.Add("ID", OracleDbType.Int64);
param1.Direction = ParameterDirection.Input;
param1.Value = ID;

OracleParameter param2 = cmd.Parameters.Add("ATTACH", OracleDbType.Blob, ImageData.Length);
param2.Direction = ParameterDirection.Input;
param2.Value = ImageData;


if (con.State == ConnectionState.Closed)
con.Open();

cmd.ExecuteNonQuery();
res = true;
}
catch (Exception ex)
{
ErorrMessage = ex.Message;

}
return res;
}