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 هم نشان میدهد.
در بانک 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 هم نشان میدهد.