PDA

View Full Version : نمایش عکس از دیتابیس



VisualStudio
دوشنبه 01 مرداد 1386, 23:26 عصر
من در انجمن جستجو کردم برای ذخیره عکس این کد را پیدا کردم و درست کار می کنه و مشکلی نداری حالا میخوام که این عکس را در PictureBox2 نمایش بدم چطور این کار را کنم
در صورتی که نمونه کدی برای هم ذخیره هم نمایش دارید لطفا دریغ نفرمایید
چطور عکس را بازخوانی کنم
من عکسمم را با این کد در دیتابیس اکسس ذخیره کردم

Dim ms As New IO.MemoryStream
PictureBox1.Image.Save(ms, PictureBox1.Image.RawFormat)
Dim arrImage() As Byte = ms.GetBuffer

ms.Close()

Dim isConnecting As Boolean = True
Dim imageStream As IO.MemoryStream = New IO.MemoryStream()
While isConnecting
Try

Dim Connection As New OleDb.OleDbConnection("Provider=microsoft.jet.oledb.4.0; data source=" & AppPath & ";Jet OLEDB:Database Password=7921496;")
Dim str_insert As String = _
"INSERT INTO `User Data` (imag)" & _
"VALUES (@image)"


Dim cmd As New OleDb.OleDbCommand(str_insert, Connection)
cmd.Parameters.Add(New OleDb.OleDbParameter("@image", arrImage)) '.Value = arrImage

Connection.Open()
cmd.ExecuteNonQuery()
Connection.Close()


isConnecting = False

MsgBox("image saved")

Catch Exc As OleDb.OleDbException
MessageBox.Show(Exc.ToString, " Exception Error!", _
MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit While
Catch exc As Exception

End Try
End While

وبرای ذخیره از این کد
Dim strConnectionString AsString = "Provider=microsoft.jet.oledb.4.0; data source=" & AppPath & ";Jet OLEDB:Database Password=7921496;"
Dim ConnectionName AsNew OleDb.OleDbConnection(strConnectionString)
Dim CommandName As OleDb.OleDbCommand
ConnectionName.Open()
CommandName = New OleDb.OleDbCommand("SELECT `imag` FROM `User Data`", ConnectionName)
CommandName.CommandType = CommandType.Text
Try
Dim Bt() AsByte = CType(CommandName.ExecuteScalar(), Byte())
Dim Mb AsNew System.IO.MemoryStream(Bt)
PictureBox2.Image = Image.FromStream(Mb)
Catch ex As Exception
MsgBox(ex.Message)
EndTry
ConnectionName.Close()

__H2__
سه شنبه 02 مرداد 1386, 11:04 صبح
سلام
کاری با کد شما ندارم، (شاید جالب نباشه ولی من همیشه به کد خودم بیشتر اعتماد دارم و ترجیح میدم کد را از اول بنویسم ولی از کد دیگران یا dll شان استفاده نکنم!!!) این کد را همین الآن نوشتم تست نکردم ولی دلیلی برای کار نکردن ندارد!

فرض شده جدولی با نام tablename و دو فیلد keyfield عددی و imagefield باینری دارد. و فرض شده سطر در بانک وجود دارد و ما الآن قصد تغییر آن را داریم میتوانید دستور را به Insert تغییر دهید، اگر تصویری در متغییر Imagefield موجود نباشد دستور در بانک مقدار Null را میریزید و در اصل بدون حذف کل سطر در بانک صرفاً فیلد تصویر خالی میشود.

ذخیره: (keyfield را که حاوی primarykey جدول است به همراه imagefield میدهید و در سطر keyfield تصویر مورد نظر اصلاح میشود.)


Dim imagefield As System.Drawing.Image = Nothing
Dim keyfield As Integer
'...
'...
'imagefield = ???
'keyfield =???
'...
Using dbCon As New System.Data.OleDb.OleDbConnection("ConnectionString")
Using dbCom As New System.Data.OleDb.OleDbCommand("UPDATE [tablename] SET [imagefield]=@imagefield WHERE ([keyfield]=@keyfield)", dbCon)
dbCom.Parameters.AddRange( _
New System.Data.OleDb.OleDbParameter() { _
New System.Data.OleDb.OleDbParameter("@imagefield", System.Data.OleDb.OleDbType.VarBinary, 0, Nothing, True, CByte(0), CByte(0), Nothing, System.Data.DataRowVersion.Current, Nothing), _
New System.Data.OleDb.OleDbParameter("@keyfield", System.Data.OleDb.OleDbType.Integer, 0, Nothing, False, CByte(0), CByte(0), Nothing, System.Data.DataRowVersion.Current, keyfield)})

If imagefield Is Nothing Then
dbCom.Parameters.Item(0).Value = System.DBNull.Value
Else
Using strm As New System.IO.MemoryStream
imagefield.Save(strm, System.Drawing.Imaging.ImageFormat.Jpeg)
dbCom.Parameters.Item(0).Value = strm.ToArray
End Using
End If

dbCon.Open()
dbCom.ExecuteNonQuery()
End Using
End Using


بازیابی: (keyfield را که primarykey جدول است میدهید تا سطر مورد نظر مشخص شود، imagefield حاوی عکس موجود در فیلد مربوط خواهد شد.)


Dim imagefield As System.Drawing.Image = Nothing
Dim keyfield As Integer

Using dbCon As New System.Data.OleDb.OleDbConnection("ConnectionString")
Using dbCom As New System.Data.OleDb.OleDbCommand("SELECT [imagefield] FROM [tablename] WHERE ([keyfield]=@keyfield)", dbCon)
dbCom.Parameters.AddWithValue("@keyfield", keyfield)


dbCon.Open()
Dim buffer() As Byte = TryCast(dbCom.ExecuteScalar, Byte())
dbCon.Close()


If buffer IsNot Nothing AndAlso buffer.Length > 0 Then
Using strm As New System.IO.MemoryStream(buffer)
imagefield = System.Drawing.Image.FromStream(strm)
End Using
End If
End Using
End Using

ice007
سه شنبه 02 مرداد 1386, 11:05 صبح
dim bitmap as new bitmap=(new system.io.bitmap(bt))

bt همان ارایه ای از باینری هاست که از دیتابیس خوندی
حالا اون بیت مپ رو به picture box بده

VisualStudio
سه شنبه 02 مرداد 1386, 18:16 عصر
متشکر از کد شما اما میشه بگید که فیلد keyfield برای چی هست
از این قسمت کد شما ایراد می گیره پیغام خیلی زیاد هست نمی تونم براتون بزارم


New System.Data.OleDb.OleDbParameter("@imagefield", System.Data.OleDb.OleDbType.VarBinary, 0, Nothing, True, 0, 0, Nothing, System.Data.DataRowVersion.Current, strm.ToArray), _
New System.Data.OleDb.OleDbParameter("@keyfield", System.Data.OleDb.OleDbType.Integer, 0, Nothing, False, 0, 0, Nothing, System.Data.DataRowVersion.Current, keyfield)})

بعد هم اینکه من میخوام عکسی را که دیتابیس بازیابی می کنم در یک PictureBox نشان داده بشه من چطوری این کار را بکنم

__H2__
چهارشنبه 03 مرداد 1386, 09:59 صبح
سلام
keyfield یک فیلد عددی است که کلید جدول است (primaryKey) مگر جدول شما primaryKey ندارد؟؟؟؟؟

شاید برای INSERT نیاز نباشد ولی بیچاره چطور بفهمد که کدام سطر را باید UPDATE یا DELETE کند؟؟؟؟؟؟

در مورد خطا هم خیلی عجیب است!!!!!
بانکتان Access است؟؟؟؟
نکند شی dbCom را از نوع SqlCommand باشد؟؟؟؟
keyfield و strm هنوز وجود دارند دیگر انشا ا....؟؟؟؟
نمیشود یک جوری، زیر سبیلی(!) پیغام خطا را بفرستید؟؟؟؟ مثلاً کلش را PM یا ایمیل کنید؟؟؟
ضمناً کد جدید یک جریقی تغییر کرده را هم تست کنید!

در مورد بازیابی هم که کدش را گذاشته بودم برادر!!!!
تصویر شما در متغییر imagefield ریخته میشود و به راحتی میتوانید با تک خط زیر تصویر را به pictureBox منتقل کنید
Me.PictureBox1.Image = imagefield

البته الآن دو خط از دستورات فوق را تغییر خواهم داد ولی ربطی به خطای شما ندارد!
به جای CType دستور TryCast را میگذارم تا خطای احتمالی ناشی از null بودن برطرف شود.
و در کد اولی هم خطی اضافه میکنم تا اگر مقدار imagefield خالی و برابر Nothing بود در بانک مقدار null ریخته شود.
دو دستور CByte را هم اضافه میکنم که شاید اگر در حالت پسندیده Strict On بوده اید، دلیل خطا همین بوده.

جمیعاً خوش باشید.

VisualStudio
چهارشنبه 03 مرداد 1386, 16:14 عصر
ببخشید واقعا شرمنده انقدر سره این برنامه خسته شدم که می خوام برنامه نویسی را ول کنم اگر ممکن هست این برنامه را برای من به صورت سلوشن این را بگزارید با بانک اطلاعات اکسس چون دوباره خطا می ده
در قسمت :


Using dbCon As New System.Data.OleDb.OleDbConnection("ConnectionString")

این خطا را می ده


Format of the initialization string does not conform to specification starting at index 0.

saeed_rezaei
چهارشنبه 03 مرداد 1386, 21:45 عصر
من در انجمن جستجو کردم برای ذخیره عکس این کد را پیدا کردم و درست کار می کنه و مشکلی نداری حالا میخوام که این عکس را در PictureBox2 نمایش بدم چطور این کار را کنم
در صورتی که نمونه کدی برای هم ذخیره هم نمایش دارید لطفا دریغ نفرمایید
چطور عکس را بازخوانی کنم


این هم یه نمونه سولیشن

__H2__
پنج شنبه 04 مرداد 1386, 11:03 صبح
سلام


ببخشید واقعا شرمنده انقدر سره این برنامه خسته شدم که می خوام برنامه نویسی را ول کنم اگر ممکن هست این برنامه را برای من به صورت سلوشن این را بگزارید با بانک اطلاعات اکسس

چشم! تا چند ساعت آینده اگر زنده بودم! البته الآن دیدم یکی از دوستان هم چیزی برای donload گذاشته!



چون دوباره خطا می ده

عزیز دل بابا!!! مشخص است ! ConnectionString رشته اتصال شما است، من آن را نموهنه نوشتم که یعنی شما در این مکان باید ConnectionString خود را قرار دهید و provider مسیر بانک را مشخص کنید!!! فکر کردم واضح است و شما خودتان ConnectionString مطلوبتان را با توجه به مسیر و نوع بانک آنجا قرار میدهید!!!!
چیزی شبیه این


"Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=""C:\news.mdb"""

__H2__
پنج شنبه 04 مرداد 1386, 13:45 عصر
سلام
گرچه از نوشتن پروژه های این تیپی خوشم نمی آید ولی برای روی ماه (ندیده) شما کدش را نوشتم!!!!!!

چیز بدی نشد! حتی میتوانید به عنوان یک گالری شخصی استفاده اش کنید و تبیعتاً میتوانید امکاناتش را بیشتر هم کنید، به عنوان نمونه دو تصویر از یک بازی را هم درش جای دادم!

(حجم حدود 103 کیلو)
http://www.h02.ir/Download.aspx?File=PictureInDatabase.zip

VisualStudio
پنج شنبه 04 مرداد 1386, 14:31 عصر
سلام
گرچه از نوشتن پروژه های این تیپی خوشم نمی آید ولی برای روی ماه (ندیده) شما کدش را نوشتم!!!!!!

چیز بدی نشد! حتی میتوانید به عنوان یک گالری شخصی استفاده اش کنید و تبیعتاً میتوانید امکاناتش را بیشتر هم کنید، به عنوان نمونه دو تصویر از یک بازی را هم درش جای دادم!

(حجم حدود 103 کیلو)
www.h02.ir/Download.aspx?File=PictureInDatabase.zip (http://barnamenevis.org/forum/www.h02.ir/Download.aspx?File=PictureInDatabase.zip)


واقعا متشکر دوست عزیز هیچ کس به اندازه شما من را یاری نکرده در این میدان (برنامه نویسی) امیدوارم روزی سعادت دیدار شما را پیدا کنم و زحمات شما را جبران کنم

saman_itc
یک شنبه 27 آبان 1386, 18:11 عصر
salam aghay _______H2______ Vaghan In COde Akhri Ke Be Sorat PRG gozashtin Fogholade bod
hame chish akhresh bod
man ba in code shoma kole nazaram dar moredr cod neveshtan taghir karde
Tashakore faravane mano bepazirin