PDA

View Full Version : خطا در ذخیره عکس در بانک اطلاعاتی



crying sphere
دوشنبه 01 شهریور 1389, 12:28 عصر
با سلام خدمت دوستان گرامی
من در برنامه خودم می خواهم تصاویری را در بانک اطلاعاتی SQLServer 2008 ذخیره کنم .
از کد زیر به این منظور استفاده کرده ام :




DA.InsertCommand = New SqlCommand("Insert Into table_aza (image) Values(@image) ", SC)

If path_picture <> "" Then
Dim ms As New IO.MemoryStream
PB_aks.Image.Save(ms, PB_aks.Image.RawFormat)
Dim ArryPic As Byte() = ms.GetBuffer
ms.Close()
DA.InsertCommand.Parameters.AddWithValue("@image", SqlDbType.Image).Value = ArryPic
Else
''DA.InsertCommand.Parameters.AddWithValue("@image", )
End If

If SC.State = ConnectionState.Closed Then
SC.Open()
End If

DA.InsertCommand.ExecuteNonQuery()

SC.Close()


مراحل گرفتن تصویر از کاربر قبلا انجام می شود .
با توجه به دستورات بالا اگر PB_aks خالی باشد یعنی کاربر عکسی را وارد نکرده باشد هنگام ثبت در بانک خطایی مبنی بر اینکه می بایست @image مقدار دهی شود می دهد .

در ضمن مشکل دیگر هم اینکه هنگام خواندن از بانک و نمایش تصویر در پیکچر باکس هم اگر تصویری وجود نداشته باشد باز هم خطا می دهد .
برای نمایش تصویر از این کدها استفاده کردم :



SC.Open()

DT.Reset()
CM.Connection = SC
CM.CommandText = "Select image From table_aza where ID= '" & ID & "'"
DA.SelectCommand = CM

DA.Fill(DT)

SC.Close()

Dim ArryPic As Byte() = DT.Rows(0).Item(0)
Dim Ms As New IO.MemoryStream(ArryPic)
PB_aks.Image = Image.FromStream(Ms)
Ms.Close()

کسی می تواند راه حلی برای مشکلات من بگوید ؟ خیلی ممنون می شوم.

crying sphere
سه شنبه 02 شهریور 1389, 21:15 عصر
آقایون خانوما لطفا یکی منو راهنمایی کنه ...

ali_najari
چهارشنبه 03 شهریور 1389, 09:01 صبح
با سلام خدمت دوستان گرامی
من در برنامه خودم می خواهم تصاویری را در بانک اطلاعاتی SQLServer 2008 ذخیره کنم .
از کد زیر به این منظور استفاده کرده ام :




DA.InsertCommand = New SqlCommand("Insert Into table_aza (image) Values(@image) ", SC)


If path_picture <> "" Then
Dim ms As New IO.MemoryStream
PB_aks.Image.Save(ms, PB_aks.Image.RawFormat)
Dim ArryPic As Byte() = ms.GetBuffer
ms.Close()
DA.InsertCommand.Parameters.AddWithValue("@image", SqlDbType.Image).Value = ArryPic
Else
''DA.InsertCommand.Parameters.AddWithValue("@image", )
End If


If SC.State = ConnectionState.Closed Then
SC.Open()
End If


DA.InsertCommand.ExecuteNonQuery()


SC.Close()


مراحل گرفتن تصویر از کاربر قبلا انجام می شود .
با توجه به دستورات بالا اگر PB_aks خالی باشد یعنی کاربر عکسی را وارد نکرده باشد هنگام ثبت در بانک خطایی مبنی بر اینکه می بایست @image مقدار دهی شود می دهد .

در ضمن مشکل دیگر هم اینکه هنگام خواندن از بانک و نمایش تصویر در پیکچر باکس هم اگر تصویری وجود نداشته باشد باز هم خطا می دهد .
برای نمایش تصویر از این کدها استفاده کردم :



SC.Open()

DT.Reset()
CM.Connection = SC
CM.CommandText = "Select image From table_aza where ID= '" & ID & "'"
DA.SelectCommand = CM

DA.Fill(DT)

SC.Close()

Dim ArryPic As Byte() = DT.Rows(0).Item(0)
Dim Ms As New IO.MemoryStream(ArryPic)
PB_aks.Image = Image.FromStream(Ms)
Ms.Close()

کسی می تواند راه حلی برای مشکلات من بگوید ؟ خیلی ممنون می شوم.


سلام و خسته نباشيد
فقط كافي بود يه Search ميزديد
منقبلا اين برنامه رو براي بچه ها گذاشته بود ميتونيد از لينك زير نمونه اش رو بگيريد



http://barnamenevis.org/forum/showpost.php?p=1071847&postcount=66

DoDoklak
چهارشنبه 03 شهریور 1389, 09:06 صبح
جهت ذخیره عکس ترجیحا از فیلدت از نوع VarBinery باشه

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



DA.InsertCommand.Parameters.AddWithValue("@image", SqlDbType.Image).Value =System.Data.SqlTypes.SqlBinary.Null

crying sphere
شنبه 06 شهریور 1389, 09:26 صبح
جهت ذخیره عکس ترجیحا از فیلدت از نوع VarBinery باشه

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



DA.InsertCommand.Parameters.AddWithValue("@image", SqlDbType.Image).Value =System.Data.SqlTypes.SqlBinary.Null


با تشکر از دوست خوبم
قطعه کد شما خیلی مفید بود . حالا من اگر بخواهم از فیلدی که عکسی در آن نیست عکسش رو بخونم , چطور باید با Null مقایسش کنم که به خطا نخوره ؟ هر کار کردم نشد .

DoDoklak
شنبه 06 شهریور 1389, 16:32 عصر
ConectionBank.Open()
Dim Data_dtr As SqlDataReader = Nothing
Using CMD As New SqlCommand("SELECT Image From Table", ConectionBank)
Data_dtr = CMD.ExecuteReader
End Using
If Data_dtr.HasRows Then
Data_dtr.Read()
If Data_dtr("Image").Equals(System.Data.SqlTypes.SqlBinary.Null) Then
'Detect Null
Else
'Detect Image
End If
End If

rezaeyan
شنبه 06 شهریور 1389, 18:09 عصر
براي ذخيره كردن عكس در ديتا بيس بايد اول آنرا به باينري تبديل كنيم . و سپس آنرا در يك بانك ذخيره كنيد .
در صورتي كه بانك شما SQL است مي توانيد از نوع داده اي Image و در صورتي كه بانك شما Access باشد بايد از نوع دادهاي OLE Object استفاده كنيد.
ذخيره سازي عكس در بانك باعث كند تر شدن فرايند ها و همچنين حجيم تر شدن بانك خواهد شد ولي در عوض باعث مي شود تهيه پشتيباني از بانكتان و همچنين حذف ويرايش و درج راحتر شود .
براي استفاده از اين كد ابتدا يك كلاس به برنامه اضافه كنيد سپس نوشته هاي آنرا پاك كرده و به جاي آن كد زير را بنويسيد.





Public Class clsConvertImage
Public Function ConvertImageToByteArray(ByVal imageToConvert As System.Drawing.Image, ByVal formatOfImage As Imaging.ImageFormat) As Byte()

Dim Ret As Byte()
Try
Dim ms As IO.MemoryStream = New IO.MemoryStream()
Using (ms)
imageToConvert.Save(ms, formatOfImage)
Ret = ms.ToArray()
End Using
Catch ex As Exception
Throw
End Try
Return Ret
End Function
Public Function ConvertBayteArrayToImage(ByVal myByteArray As Byte()) As System.Drawing.Image
Dim newImage As System.Drawing.Image
Dim ms As IO.MemoryStream = New IO.MemoryStream(myByteArray, 0, myByteArray.Length)
Using (ms)
ms.Write(myByteArray, 0, myByteArray.Length)
newImage = Image.FromStream(ms, True)
End Using
Return newImage
End Function
End Class
'**************************
'Add This Object to the form
'1) PictureBox => name =picShow
'2) OpenFileDialog => name=dlgOpenPicture
'3) Three Button => name1= btnSave , name2 = btnOpen , name3 = btnShow
'4) add one Access DataBase in drive C:\Data\myDb.mdb
‘add table name tb1 -> add fild name=img type=OLE Object

Imports System.Data
Imports System.Data.OleDb
Public Class Form1
Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
Try
Dim clsConvertImage As New clsConvertImage
Dim con As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\data\mydb.mdb;")
Dim byt As Byte() = clsConvertImage.ConvertImageToByteArray(picShow.Im age, picShow.Image.RawFormat)
Dim SQL As String = "insert into tb1(img) values (@img)"
Dim cmd As New OleDbCommand(SQL, con)
cmd.Parameters.AddWithValue("img", byt)
Using con
con.Open()
MsgBox("Doing operaion : " & (cmd.ExecuteNonQuery() > 0))
End Using

Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub

Private Sub btnShow_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnShow.Click
picShow.Image = Nothing
Dim strIn As String = InputBox("enter number:", "select picture", "2").Trim
If strIn.Length > 0 And IsNumeric(strIn) Then
Try
Dim clsConvertImage As New clsConvertImage
Dim con As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Visual Studio 2005\Projects\ConvertImageToByteArray\ConvertImage ToByteArray\bin\Debug\mydb.mdb;")
Dim intIn As Integer = strIn
Dim SQL As String = "select img from tb1 where id =@id"
Dim cmd As New OleDbCommand(SQL, con)
cmd.Parameters.AddWithValue("id", intIn)
Using con
con.Open()
Dim imgTmp As Image
imgTmp = clsConvertImage.ConvertBayteArrayToImage(cmd.Execu teScalar())
picShow.Image = imgTmp
End Using

Catch ex As Exception
MessageBox.Show(ex.Message)
End Try

End If

End Sub

Private Sub btnOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOpen.Click
If dlgOpenPicture.ShowDialog = Windows.Forms.DialogResult.OK Then
picShow.Image = System.Drawing.Image.FromFile(dlgOpenPicture.FileN ame)
End If

End Sub
End Class