У меня есть форма, содержащая список со списком имен изображений. Это связано к таблице базы данных. При нажатии на имя изображения оно показывает изображение и imagename в картинках и текстовых полях соответственно. Когда изображение не выбрано в списке, новая запись может быть вставлена путем просмотра нового изображения в Picturebox от openfiledialog, записав имя изображения в текстовое поле и нажав кнопку ОК. Когда изображение уже выбрано, запись может быть обновляется нажатием той же кнопки ОК. Данные сохраняются в MSSQL Server. 2005. Соответствующие поля таблицы: Keycode int autono, логон nvarchar (50), изображение логотипа. Теперь проблема, когда я вставляю новые данные с изображением, все идет хорошо но всякий раз, когда я пытаюсь обновить существующие данные с изображением, он бросает исключение - «Произошла общая ошибка в GDI +». на следующей строке- 'pic.Image.Save (ms, pic.Image.RawFormat)'. Удивительно, когда я обновляю существующие данные без какого-либо изображения в окне рисунка без исключения генерируется. Я проверял это, и кажется, что проблема только в одной точке «Обновление изображения из картинки». Я почти закончил все, но застрял в этом конкретном моменте. Пожалуйста помоги. С уважением.
Мой код для вставки / обновления данных с помощью кнопки ОК и для заполнения его списком doubleclick:
Private ms As MemoryStream Private arrImage() As Byte Private conn As SqlConnection Private cmd As SqlCommand Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Method to bind listbox. BindListBox(lst, "Select Keycode,LogoName from tbltest", "Logoname", "keycode") Tag = "Insert" End Sub Private Sub lst_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles lst.DoubleClick Dim dr As SqlDataReader dr = CreateReader("Select LogoName,logo from tblTest where keycode=" & lst.SelectedValue) If dr.Read Then txtLogoName.Text = vbNullString & dr("Logoname") If Not IsDBNull(dr("Logo")) Then arrImage = CType(dr("Logo"), Byte()) ms = New MemoryStream(arrImage) pic.Image = Image.FromStream(ms) ms.Close() Else pic.Image = Nothing pic.Invalidate() End If Tag = "Update" End If dr.Close() closeconnection() arrImage = Nothing ms = Nothing End Sub Private Sub btnOk_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOk.Click Dim com As SqlCommand Dim strSql As String If Tag = "Insert" Then strSql = "Insert into tbltest (logoname,logo) values ('" & Trim(txtLogoName.Text) & "',@Logo)" Else strSql = "Update tbltest set logoname='" & Trim(txtLogoName.Text) & "',Logo=@Logo Where keycode=" & lst.SelectedValue End If com = CreateCommand(strSql) com.Parameters.Add(New SqlParameter("@Logo", SqlDbType.Image)) If Not pic.Image Is Nothing Then ms = New MemoryStream() pic.Image.Save(ms, pic.Image.RawFormat) arrImage = ms.GetBuffer ms.Close() com.Parameters("@Logo").Value = arrImage Else com.Parameters("@Logo").Value = DBNull.Value End If If com.ExecuteNonQuery = 1 Then closeconnection() BindListBox(lst, "Select Keycode,LogoName from tbltest", "Logoname", "keycode") pic.Image = Nothing pic.Invalidate() txtLogoName.Clear() Tag = "Insert" End If arrImage = Nothing ms = Nothing strSql = Nothing End Sub Private Sub btnBrowse_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBrowse.Click With dlg .Filter = "All Files|*.*|Bitmap|*.bmp|GIF|*.gif|Icon|*.ico|JPEG|*.jpg|PNG|*.png" .FilterIndex = 5 End With If dlg.ShowDialog() = DialogResult.OK Then pic.Image = Image.FromFile(dlg.FileName) End Sub Public Sub setconnection() Try conn = New SqlConnection("Data Source=MyServer;Initial Catalog=TestDB;User Id=sa;Password=;") conn.Open() Catch ex As Exception MsgBox(ex.Message) End Try End Sub Public Sub closeconnection() conn.Close() End Sub Public Function CreateCommand(ByVal query As String) As SqlCommand setconnection() Dim command As New SqlCommand(query, conn) Return command End Function Public Function CreateReader(ByVal query As String) As SqlDataReader Dim reader As SqlDataReader setconnection() cmd = CreateCommand(query) reader = cmd.ExecuteReader() Return reader End Function