У меня есть форма, содержащая список со списком имен изображений. Это связано
к таблице базы данных. При нажатии на имя изображения оно показывает изображение и
imagename в картинках и текстовых полях соответственно. Когда изображение не выбрано
в списке, новая запись может быть вставлена путем просмотра нового изображения в
Picturebox с помощью openfiledialog, записав имя изображения в текстовое поле и
нажав кнопку ОК. Когда изображение уже выбрано, запись может быть
обновляется нажатием той же кнопки ОК. Данные сохраняются в MSSQL Server.
2005. Соответствующие поля таблицы: Keycode int autono,
логон nvarchar (50), изображение логотипа.
Теперь проблема, когда я вставляю новые данные с изображением, все идет хорошо
но всякий раз, когда я пытаюсь обновить существующие данные с изображением, он бросает
исключение - «Произошла общая ошибка в GDI +». на следующей строке-
'pic.Image.Save (ms, pic.Image.RawFormat)'. Удивительно, когда я обновляю
существующие данные без какого-либо изображения в окне рисунка без исключения генерируется.
Я проверял это, и кажется, что проблема только в одной точке
«Обновление изображения из картинки».
Я почти закончил все, но застрял в этом конкретном моменте. Пожалуйста помоги. С уважением.
Мой код для вставки / обновления данных кнопкой ОК и для заполнения списком
двойной клик следует:
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