PDA

View Full Version : بازیابی تصویر Image از بانک



rosenth
شنبه 11 شهریور 1385, 14:11 عصر
من به تازگی ذخیره و بازیابی تصویر را در sql Server و در محیط .NET را یاد گرفتم.
در بانک 5 فیلد تصویر دارم و موقع ذخیره کردن از 5 متغیر از نوع Byte استفاده می کنم . تصاویر را در متغیر ها میریزم و اگر کاربر تصویری انتخاب نکرده باشد مقدار NULL در متغیر و در نهایت در بانک قرار میگیرد.
تا اینجا به نظر مشکلی نیست و اطمینان از اینکه تصویرها به درستی در بانک ذخیره شده اند میسر نیست.
برای بازیابی هم از 5 متغیر استفاده کردم . با یک SqlDataReader و به صورت Sequential داده ها را از بانک می خوانم و از یک تابع هم طوری استفاده کردم که بتوانم با فراخوانی آن برای هر 5 متغیر تصاویر را لود کنم .

.تابع به صورت زیر است که و متغیر Byte و اندیس فیلدی که باید داده از آن استخراج شود و شی PictureBox مربوطه برای لود تصویر در آن |و dataReader، ارسال میشود.


FillPicture(bImg0,2,picBox0,Reader);
تابع FillPicture :


void FillPicture(Byte bArray[],int i,Object* sender,SqlDataReader* Reader)
{

long retVal;
retVal=Reader->GetBytes(i,0,NULL,0,UInt32::MaxValue);
Line 22: // Make Sure reader Give me a Differnt data
MessageBox::Show(retVal->ToString());

if(retVal!=0) // if image is not Empty
{
Byte byteArr[]=new Byte[retVal];
// create a different file name!
String* finame=DateTime::Now.ToFileTime().ToString();

Reader->GetBytes(i,0,byteArr,0,retVal);
FileStream* fStream=new FileStream (finame,FileMode::OpenOrCreate,FileAccess::Write);
// write byte array in Stream
fStream->Write(byteArr,0,retVal);
// Load Image into PictureBox
dynamic_cast<PictureBox*>(sender)->Image=Image::FromStream(fStream);
bArray=byteArr;

fStream->Flush();
fStream->Close();
}
else if(retVal==0)
{
MessageBox::Show(S" <<< no image");
dynamic_cast<PictureBox*>(sender)->Image=NULL;
bArray=NULL;
}
// Close the output file
}
مشکل اینجاست که Reader همیشه مقدار اولین فیلد تصویر را نشان میدهد و برای مابقی فیلدها هم همان اولی را برمیگرداند و این مطلب را خط 22 هم نشان میدهد.

rosenth
شنبه 11 شهریور 1385, 20:39 عصر
من فهمیدم مشکل از خواندن استریم برای چند تصویر بوجود می آید . بازیابی یک تصویر مشکلی ندارد.

rosenth
یک شنبه 12 شهریور 1385, 12:05 عصر
به جای کد

String* finame=String::Concat(DateTime::Now.ToFileTime().T oString(),S".jpg"); // create a different file name!
Reader->GetBytes(4,0,byteArr,0,retVal);
FileStream* fStream=new FileStream(finame,FileMode::OpenOrCreate,FileAcces s::Write);
fStream->Write(byteArr,0,retVal);
بهتر است کد زیر را اضافه کرد تا برنامه به خوبی کار کند

Reader->GetBytes(i,0,byteArr,0,retVal);
MemoryStream* fStream=new MemoryStream(byteArr);

rosenth
سه شنبه 14 شهریور 1385, 18:26 عصر
یک سوال دیگر
برنامه به من اجازه نمی دهد که درون فیلد های خالی از نوع تصویر مقدار NULL قرار بدهم. چه مقداری می تواند نشان دهد فیلدها خالی هستند؟