PDA

View Full Version : ذخيره عكس در ديتا بيس sql



safasoft
سه شنبه 28 خرداد 1387, 08:33 صبح
سلام
من مي خواهم عكس را درون بانك اطلاعاتي به گونه اي ذخيره كنم كه قابليت گزارش گيري توسط كريستال ريپورت را داشته باشد .
خودم اول فيلد عكس در بانك را به صورت image تعريف كرده بودم ولي در زمان ذخيره اطلاعات عكس ذخيره نمي شد .
سرچ كردم ولي چيزي پيدا نمي كنه
از راهنمايي تون ممنون مي شم .

negar_programmer
سه شنبه 28 خرداد 1387, 12:00 عصر
تو برنامه ها من ديدم كه با مسير ذخيره عكس ، عكس را توي DB ذخيره مي كنند . شما هم همين كار را كن و هنگام واكشي داده ها و نمايش بوسيله كريستال يه object از نوع image ايجاد كن و آدرس عكس را براي نمايش همون مقدار ذخيره شده در DB قرار بده عكس نمايش داده مي شه

saeed_rezaei
سه شنبه 28 خرداد 1387, 19:34 عصر
سلام

خودم اول فيلد عكس در بانك را به صورت image تعريف كرده بودم ولي در زمان ذخيره اطلاعات عكس ذخيره نمي شد
از نمونه کدهای زیر جهت نوشتن و خواندن عکس در بانک اطلاعاتی می تونی استفاده کنی.
در این نمونه کد، قصد آن است که تصویر موجود در picturebox1 در بانک اطلاعاتی sql نگهداری شود.
همچنین فرض شده که جدول مربوطه تنها یک فیلد با نام picture و نوع image داره.

این کد برای ذخیره تصویر استفاده مشه.


Dim ms AsNew MemoryStream()
PictureBox1.Image.Save(ms, PictureBox1.Image.RawFormat)
Dim arrImage() AsByte = ms.GetBuffer

ms.Close()

Dim myConnection AsNew SqlConnection(connectionString)
Dim strSQL AsString = "INSERT INTO Picture ( Picture) VALUES (@Picture)"

Dim cmd AsNew SqlCommand(strSQL, myConnection )
cmd.Parameters.Add(New SqlParameter("@Picture",SqlDbType.Image)).Value = arrImage

myConnection .Open()
cmd.ExecuteNonQuery()
myConnection .Close()



و اما برای نمایش مجدد تصویر در picturebox



Dim arrPicture() AsByte = CType(dsPictures.Tables(0).Rows(?)("Picture"), Byte())
Dim ms AsNew MemoryStream(arrPicture)
With PictureBox2
.Image = Image.FromStream(ms)
.SizeMode = PictureBoxSizeMode.StretchImage
.BorderStyle = BorderStyle.Fixed3D
EndWith

نمونه کد بالا تصویر رو از بانک نمایش می ده.
همچنین در این کد، تصویر مربوطه در رکورد ؟ ذخیره شده.
فکر نمی کنم کدها نیازی به توضیح بیشتری داشته باشن.


قابليت گزارش گيري توسط كريستال ريپورت را داشته باشد
و امااینکه چطور این رو در کریستال ریپورت نشون داد. تاحالا واسه من همچین کاری پیش نیومده. اما این روشی که دوستمون negar_programmer گفتند، اگه درست باشه می تونید از تلفیق این کدها و روش دوستمون مشکلتون رو حل کنید.

safasoft
چهارشنبه 29 خرداد 1387, 11:54 صبح
با تشكر از پاسخ هاي شما
من ترجيحا از آدرس فايل را با كد زير ذخيره كردم
در رويداد دريافت فايل تصوير


IfMe.OpenFileDialogpicture.ShowDialog() = Windows.Forms.DialogResult.OK Then
pictureperson = OpenFileDialogpicture.FileName
PictureBoxaks.Load(pictureperson)
Me.Validate()
Dim rowperson() As DataRow
rowperson = PersoneliDataSet1.moshakhasatpersonel.Select("codepersoneli='" + CodepersoneliTextBoxX.Text + "'")
rowperson(0).Item("aks") = pictureperson.ToString
EndIf

حالا ديگر با يك ذخيره ساده آدرس عكس ذخيره مي شود
براي لود آن


Dim rowperson() As DataRow
If CodepersoneliTextBoxX.Text <> ""Then
rowperson = PersoneliDataSet1.moshakhasatpersonel.Select("codepersoneli='" + CodepersoneliTextBoxX.Text + "'")
pictureperson = rowperson(0).Item("aks").ToString
If pictureperson <> ""Then
PictureBoxaks.Load(pictureperson)
EndIf

drwatson
چهارشنبه 29 خرداد 1387, 12:15 عصر
[quote=saeed_rezaei;538588]سلام

از نمونه کدهای زیر جهت نوشتن و خواندن عکس در بانک اطلاعاتی می تونی استفاده کنی.
در این نمونه کد، قصد آن است که تصویر موجود در picturebox1 در بانک اطلاعاتی sql نگهداری شود.
همچنین فرض شده که جدول مربوطه تنها یک فیلد با نام picture و نوع image داره.

این کد برای ذخیره تصویر استفاده مشه.


Dim ms AsNew MemoryStream()
PictureBox1.Image.Save(ms, PictureBox1.Image.RawFormat)
Dim arrImage() AsByte = ms.GetBuffer

ms.Close()

Dim myConnection AsNew SqlConnection(connectionString)
Dim strSQL AsString = "INSERT INTO Picture ( Picture) VALUES (@Picture)"

Dim cmd AsNew SqlCommand(strSQL, myConnection )
cmd.Parameters.Add(New SqlParameter("@Picture",SqlDbType.Image)).Value = arrImage

myConnection .Open()
cmd.ExecuteNonQuery()
myConnection .Close()



و اما برای نمایش مجدد تصویر در picturebox



Dim arrPicture() AsByte = CType(dsPictures.Tables(0).Rows(?)("Picture"), Byte())
Dim ms AsNew MemoryStream(arrPicture)
With PictureBox2
.Image = Image.FromStream(ms)
.SizeMode = PictureBoxSizeMode.StretchImage
.BorderStyle = BorderStyle.Fixed3D
EndWith

نمونه کد بالا تصویر رو از بانک نمایش می ده.
همچنین در این کد، تصویر مربوطه در رکورد ؟ ذخیره شده.
فکر نمی کنم کدها نیازی به توضیح بیشتری داشته باشن.


ببخشید میون کلامتون میام
اما وقتی اینکارو میکنیم بعد از اینکه عکس بازیابی شد و در picBox قرار گرفت چرا نمیشه با دستور savepicture اون تو فایل ذخیره کرد؟؟؟؟؟؟؟؟؟؟

saeed_rezaei
چهارشنبه 29 خرداد 1387, 16:18 عصر
سلام


اما وقتی اینکارو میکنیم بعد از اینکه عکس بازیابی شد و در picBox قرار گرفت چرا نمیشه با دستور savepicture اون تو فایل ذخیره کرد؟؟؟؟؟؟؟؟؟؟

وقتی تصویر در بانک ذخیره می شه به صورت بایت نگهداری می شه. در هنگام بازیابی این بایتها در یک memory stream قرار می گیرن و در picturebox لود می شه. چون memory stream یک رشته از اطلاعات در حافظه کامپیوتر هستش، برای ذخیره سازی نمی شه به صورت مستقیم از save استفاده کرد.
برای ذخیره تصویر بایستی روش دیگه ای رو استفاده کرد.
من ترجیح می دم که اون بایتهای از اطلاعات که توی حافظه هست رو مستقیما بیارم توی یه filestream که قابلیت ذخیره سازی روی هارد دیسک رو داشته باشه.
نمونه کد زیر این کار رو انجام می ده.
در این نمونه کد تصویر در مسیر f:\1.jpg ذخیره می شه.




Dim fs2 As New IO.FileStream("f:\1.jpg", FileMode.Create, FileAccess.Write, FileShare.None)
fs2.Write(arrPicture, 0, arrPicture.Length)
fs2.Close()


لازم به توضیح هست که این قطعه کد رو باید در ادامه کدهای فراخوانی تصویر قرار داد.

parsavb
چهارشنبه 29 خرداد 1387, 17:37 عصر
یه نگاهی به این برنامه بندازید شاید به دردتون خورد
http://barnamenevis.org/forum/attachment.php?attachmentid=18564&d=1212407960