PDA

View Full Version : مهم : نمایش تصویر از فیلد نوع Blob در Oracle



mehrdotnet
یک شنبه 29 آبان 1384, 21:19 عصر
سلام به همه دوستان برنامه نویس
ما یک Oracle DB داریم که توی اون تصاویر درون فیلد از نوع Blob ذخیره شده. حالا چه طوری می تونیم این تصاویر رو از DB واکشی کنیم و نمایش بدیم ؟
در ضمن در حال انجام یک پروژه هستم و توی این قسمتش گیر افتادم. لطفاً اگه ممکنه سریعتر یاری فرمایید. فوریه!!!

Behrouz_Rad
یک شنبه 29 آبان 1384, 23:30 عصر
بستگی داره که شما به چه شکل با Oracle ارتباط برقرار می کنید...
آیا از پرووایدر مخصوص آن استفاده می کنید (OracleClient) و یا از پرووایدر OLEDB یا ODBC استفاده می کنید؟
پرووایدر مخصوص Oracle از لینک زیر قابل داونلود است:
http://otn.oracle.com/software/tech/windows/odpnet/content.html

یک مثال ساده با فرض استفاده از پرووایدر OLEDB


OleDbDataReader dr = cmd.ExecuteReader( );
if(dr.Read( ))
{
Response.ContentType = "image/bmp";
Response.BinaryWrite((byte[])dr["Photo"]);
}
dr.Close( );

پ.ن: روند بازیابی داده های binary از تمامی DBMS ها تقریبا به یک شکل انجام می پذیرد.
موفق باشید.

mehrdotnet
دوشنبه 30 آبان 1384, 19:23 عصر
سلام جناب راد
ممنون از اینکه به سوالم جواب دادین ولی :
1- من از OracleClient و Oracle Connection برای ارتباط استفاده می کنم.
2- من نمی خوام تصویر رو همینطوری روی صفحه بکشم بلکه می خوام توی یک ImageBox یا چیز دیگه ای شبیه اون قرار بدم تا بتونم جاش رو روی صفحه مشخص کنم. مثلاً بذارمش کنار صفحه توی یک سلول خاص از یک Table.
با تشکر اگه ممکنه راهنمایی بفرمایید.

Behrouz_Rad
دوشنبه 30 آبان 1384, 22:05 عصر
1) قبلا هم عرض کردم که نوع پرووایدر شما در روند کار دخالتی نداره!

2) بسیار خوب!
از آنجا که تعیین عکسی که قرار است نمایش داده شود، با تنظیم خاصیت ImageUrl کنترل Image انجام می پذیرد و این خاصیت با یک مقدار از نوع رشته ای سر و کار دارد، پس تنها راه، تبدیل داده های باینری ذخیره شده ، به عکس و انتساب نام و محل ذخیره ی عکس به خاصیت ImageUrl کنترل Image است.
با دستوراتی شبیه به آنچه که در زیر نوشتم، قادر به پیاده سازی جواب سوال خود هستید:


Dim fs As FileStream
Dim bw As BinaryWriter
Dim bufferSize As Integer = 300000
Dim outbyte(300000 - 1) As Byte
Dim retval As Long
Dim reader As OleDbDataReader = cmd.ExecuteReader(CommandBehavior.SequentialAccess )
reader.Read()
fs = New FileStream("getImageNameFromDatabase", FileMode.OpenOrCreate, FileAccess.Write)
bw = New BinaryWriter(fs)
retval = reader.GetBytes(0, 0, outbyte, 0, bufferSize)
bw.Write(outbyte)
bw.Flush()
bw.Close()
fs.Close()
reader.Close()
Image1.ImageUrl = Image.FromFile("getImageNameFromDatabase")

پ.ن: این نوع تبدیلات زمان بر است به همین خاطر یکی از دلایلی که گفته می شود تنها مسیر عکس را در دیتابیس ذخیره کنید، جلوگیری از این نوع تبدیلات است.
اضافه کردن نیم اسپیس System.IO را فراموش نکنید.
موفق باشید.

mehrdotnet
سه شنبه 01 آذر 1384, 00:04 صبح
سلام
قربون مرامتون ! از اینکه اینقدر پیگیر قضایا هستین خیلی خیلی تشکر.
سوالی که کردم مربوط به سیستم انتخاب واحد یک مرکزه که همونطور که می دونین توی یک لحظه ممکنه ده ها نفر و شاید بیشتر وارد سایت بشن و بخواهند استفاده کنن.
از طرفی همونطور که خودتون فرمودین کاری که من قصد دارم انجام بدم و شما هم زحمت کشیدین و راه حلشو ارائه دادین کاری وقت گیره.
حالا من یه چیزی به نظرم رسید! البته خیلی ساده است. گفتم اولش با شما در میون بگذارم اگه درسته انجامش بدم.
اگر یک UserControl بسازم و داخلش از روش اولی که ارائه کردین استفاده کنم و بعد این UserControl رو توی سلول جدول مورد نظرم قرار بدم عملی خواهد بود و تقریباً مثل همون ImageBox میشه یا خیر.
اگر نظرتون مثبته و امکانش هست کد اولتون رو یه خورده مفصل تر توضیح بدین و اگه زحمتتون نیست ترجیحاً VB Syntax باشه بهتره.
از اینکه اینقدر پر رویی می کنم ببخشین. ما هم امیدمون به این سایت و دوستان و متخصصینی مثل شماست.

Behrouz_Rad
سه شنبه 01 آذر 1384, 00:15 صبح
خیر همونی که گفتم بهترین روشه.
اینجور به ازای هر فرد یک بار باید User Control ایجاد و پردازش بشه که اصلا توصیه نمی کنم.

mehrdotnet
سه شنبه 01 آذر 1384, 00:35 صبح
بسیار خوب!
خیلی ممنون پس از همون روش دوم استفاده می کنم و اگه مشکلی بود باز مزاحمتون خواهم شد. خدا کنه خیلی روی زمان لود تاثیر نداشته باشه. امیدوارم!

Behrouz_Rad
سه شنبه 01 آذر 1384, 07:53 صبح
چرا تنها مسیر عکس رو در دیتابیس ذخیره نمی کنید؟

mehrdotnet
سه شنبه 01 آذر 1384, 18:50 عصر
به خاطر اینکه پروژه قبلاً تحلیل شده ، DB طراحی و آماده شده و Application ویندوزی اش هم با دلفی نوشته شده و آماده است و من فقط وظیفه دارم بخش وب اون رو باید طراحی کنم و باید از همین DB استفاده کنم.

mehrdotnet
چهارشنبه 02 آذر 1384, 19:50 عصر
آقا این مشکل من باز هم حل نشد.
میدونم خودم گیج بازی در آوردم ولی ببخشین از کم تجربگی توی کار کردن با اوراکله.
همونطور که گفتم این DB از قبل آماده است. برای لاگین یک Procedure نوشته شده که شماره دانشجویی و Password رو به عنوان پارامتر ورودی میگیره و مشخصات اون و عکس اون رو که یک فیلد Blob هست به عنوان پارامتر خروجی بر می گردونه حالا من می خوام عکس توی این فیلد رو نمایش بدم.
همه کدش رو که خیلی طولانیه چون پارامترهاش زیاده ولی تا اون قسمتها رو حذف کردم و کدش رو هم گذاشتم. پارامترها درست گرفته میشه چون بقیه پارامترها رو به خوبی میشه استفاده کرد. برای این عکس یه جایی دارم اشتباه فاحش می کنم ولی نتونستم درستش کنم. حالا میشه این کد رو اصلاحش کنین :



com.Connection = OracleCnn
com.CommandText = "PRC_STUDENT_LOGIN"
com.CommandType = CommandType.StoredProcedure
com.Parameters.Add(New OracleClient.OracleParameter("Pic_P", OracleClient.OracleType.Blob))
com.Parameters("Pic_P").Direction = ParameterDirection.Output
OracleCnn.Open()
com.ExecuteNonQuery()
Dim fs As FileStream
Dim bw As BinaryWriter
Dim bufferSize As Integer = 300000
Dim outbyte(300000 - 1) As Byte
Dim retval As Long
fs = New FileStream(StuInformation.Student_Internal_Code, FileMode.OpenOrCreate, FileAccess.Write)
bw = New BinaryWriter(fs)
Session("stupic") = com.Parameters("Pic_P").Value
retval = Session("stupic").GetBytes(0, 0, outbyte, 0, bufferSize)
bw.Write(outbyte)
bw.Flush()
bw.Close()
fs.Close()
OracleCnn.Close()


خواهش می کنم بررسی کنین و اگه ممکنه مشکلش رو بگین

Behrouz_Rad
چهارشنبه 02 آذر 1384, 22:01 عصر
دوست عزیز!!!
از قول بنده به DataReader سلام برسونید و احوال متد ExecuteReader رو هم بپرسید!!!
بهتره با دقت بسیار بیشتری به کد بنده توجه بفرمایید...
موفق باشید.

mehrdotnet
جمعه 04 آذر 1384, 12:14 عصر
متشکرم مشکلم کاملاً حل شد!!! همانطور که گفتم اشتباه فاحش از من بود!

mehrdotnet
شنبه 05 آذر 1384, 18:24 عصر
دوباره سلام! البته با عرض شرمندگی!!!
بک مشکلی وجود داره یک سری از تصاویر به درستی نشون داده میشن اما بعضی دیگه نصف بالایی شون سیاه می خوره. در صورتی که همه تصاویر سالم اند و توی Delphi Application که از همین DB استفاده می کنه به درستی نشون داده می شن!!!
یعنی مشکل از کجا می تونه باشه؟!

mehrdotnet
شنبه 05 آذر 1384, 23:27 عصر
تصویرها رو یکبار دیگه امتحان کردم به یک قالب هم ذخیره شده اند فقط نمیدونم چرا بعضی هاش نصف بالایی کاملاً سیاه میشه ولی نصفه پایینی درسته. فکر کنم اگه قالب مشکل داشت همه تصویر از بین میرفت! ولی حالا...
نمیدونم والا ؟؟؟؟؟؟؟؟؟؟

mehrdotnet
یک شنبه 06 آذر 1384, 19:45 عصر
سلام
استاد جون شرمنده!
حل شد! بافرش رو از 300000 به 1000000 افزایش دادم شد! :لبخند:
باز هم از زحمات بی کران تون نهایت سپاس رو دارم :قلب:
(وی خودمونیما خوب بلدین آدمو به تلاش وادار کنینا. :چشمک: اونقدر جوابمو ندادین تا خودم برم سعیمو بکنم. ایول حقا که تو کارتون استادین. انصافاً به حق مدیر شدین. :تشویق: البته اشتباه نشه قصد چاپلوسی نداشتم:بوس: )