PDA

View Full Version : سوال: اضافه کردن تصاویر در دیتابیس اکسس



hamidrezax1
چهارشنبه 28 تیر 1402, 05:11 صبح
سلام دوستان وقت بخیر.من میخوام از یه دیتابیس اکسس که داخلش عکس هست و به صورت باینری ذخیره شده تصاویر رو به دیتابیس اکسس دیگه ای انتقال بدم.مشکل زمانی هست که توی حلقه for اطلاعات insert میکنم اطلاعات درست جابجا میشه اما فقط عکس اول دیتابیس ذخیره میشه به جای بقیه عکس ها.در صورت امکان راهنمایی کنید.با تشکر



Dim ms As New System.IO.MemoryStream
PictureBox1.Image.Save(ms, PictureBox1.Image.RawFormat)
Dim arrimage() As Byte = ms.GetBuffer
Dim bmpImage As New Bitmap(PictureBox1.Image)
bmpImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg)
bytImage = ms.ToArray()
bmpImage.Dispose()


Connection_2.Open()
Command_2.Connection = Connection_2
Command_2.CommandType = CommandType.Text
Command_2.CommandText = "INSERT INTO `pic` (`pic`) VALUES (@pic)"
Command_2.Parameters.AddWithValue("@pic", bytes)
Command_2.ExecuteNonQuery()
Connection_2.Close()

mazoolagh
چهارشنبه 28 تیر 1402, 09:11 صبح
سلام و روز خوش

این کد فقط دیتا یک picturebox رو در دیتابیس میریزه،
حلقه ای هم دیده نمیشه!

یعنی شما تصاویر رو یکی یکی از دیتابیس اول در یک پیکچرباکس لود میکنین و بعد اون رو در دیتابیس دوم میریزین؟
خب چرا مستقیم دیتا رو کپی نمیکنین؟

hamidrezax1
چهارشنبه 28 تیر 1402, 09:27 صبح
سلام دوست گرامی.شما فرض رو بر این بزارید که کد ها درون حلقه هستن و با این کد بایستی در دیتابیس جدید ذخیره بشوند.یعنی توی هر حلقه ابتدا من عکس رو عوض میکنم و درون پیکچرباکس قرار میدم بعد اون رو به باینری تبدیل میکنم و ذخیره میکنم.منتحی توی هر با چرخش فقط همون عکس اولیه ذخیره میشه

پرستو پارسایی
چهارشنبه 28 تیر 1402, 09:44 صبح
مشکل در کد شما این است که شما همیشه از مقدار bytes برای پارامتر @pic استفاده می کنید. بنابراین، هربار که حلقه for اجرا می شود، مقدار bytes با مقدار تصویر جدید جایگزین می شود. به عبارت دیگر، شما همیشه تصویر اول را در دیتابیس ذخیره می کنید. برای حل این مشکل، باید هربار که حلقه for اجرا می شود، پارامتر @pic را با مقدار تصویر جدید جایگزین کنید. بعنوان مثال

For i As Integer = 0 To DataGridView1.Rows.Count - 1
Dim ms As New System.IO.MemoryStream
Dim pic As Image = DataGridView1.Rows(i).Cells(0).Value
pic.Save(ms, pic.RawFormat)
Dim arrimage() As Byte = ms.GetBuffer
Dim bmpImage As New Bitmap(pic)
bmpImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg)
Dim bytImage() As Byte = ms.ToArray()
bmpImage.Dispose()


Connection_2.Open()
Command_2.Connection = Connection_2
Command_2.CommandType = CommandType.Text
Command_2.CommandText = "INSERT INTO `pic` (`pic`) VALUES (@pic)"
Command_2.Parameters.Clear()
Command_2.Parameters.AddWithValue("@pic", bytImage)
Command_2.ExecuteNonQuery()
Connection_2.Close()
Next






در این کد، هربار که حلقه for اجرا می شود، تصویر مربوطه را از DataGridView به عنوان مقدار پیش فرض برای پارامتر pic در نظر می گیریم. سپس، تصویر را به صورت باینری در آرایه bytImage ذخیره می کنیم و آن را به عنوان مقدار پارامتر @pic در دستور INSERT INTO قرار می دهیم. در هر دور از حلقه، پارامتر Command_2.Parameters را با استفاده از Command_2.Parameters.Clear() پاک می کنیم تا مشکل استفاده مجدد از مقدار پارامتر قبلی را حل کنیم. سپس دستور INSERT INTO را اجرا می کنیم و در انتها اتصال به دیتابیس را بسته و به تصویر بعدی می رویم.

hamidrezax1
چهارشنبه 28 تیر 1402, 12:03 عصر
سلام و وقت بخیر مهندس.ممنون از زحمتی که کشیدیدواقعا عالی بود.در کد هام دستور زیر رو کم داشتم تا پارامتر رو خالی کنه ممنون و سپاسگذارم.موفق و پیروز باشید



Command_2.Parameters.Clear()