将图像从图片库保存到数据库时出现问题。 VB.Net 2008.框架3.5

问题描述:

我有一个窗体包含一个列表框显示图像名称列表。它绑定到数据库表 。当单击图像名称时,它分别在图片框和文本框中显示图像和图像名称。当在列表框中没有选择图像 时,可以通过在openfiledialog中浏览 picturebox中的新图像,在文本框中写入imagename,并按下OK按钮来插入新记录。 当图像已被选中时,可通过按下相同的OK按钮更新记录 。将数据保存到MSSQL服务器 2005.对应的表字段是Keycode int autono, logoname nvarchar(50),logo图像。 现在的问题是,当我用图像插入新数据时,一切正常 但是每当我尝试用图像更新现有数据时,都会抛出 异常 - 'GDI +中发生了一般性错误'。在以下行 - 'pic.Image.Save(ms,pic.Image.RawFormat)'。令人惊讶的是,当我更新现有数据时,picturebox中没有任何图像,不会生成异常。 我已经过检查它,似乎这个问题只是在一个点 - '从图片框更新图像'。 我几乎完成了所有工作,但坚持了这一点。请帮忙。问候。将图像从图片库保存到数据库时出现问题。 VB.Net 2008.框架3.5

我的代码中插入/按OK键更新数据,并通过列表框来填充它 双击如下:

 
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) & "',[email protected] 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 
+0

你究竟想要做什么?你想将图像保存到数据库还是你有其他问题? – 2010-08-20 15:03:57

+0

你有没有找到解决方案? – 2012-05-21 00:01:21

帮自己一个大忙和共享网络驱动器上保存之外的图像作为单独的文件的数据库。在数据库中只存储文件名。

这有两个好处:调试你的图像文件会容易得多,而且你的数据库会更小,运行速度更快。

使用参数。更改此:

strSql = "Update tbltest set logoname='" & Trim(txtLogoName.Text) & "',[email protected] Where keycode=" & lst.SelectedValue 

strSql = "Update tbltest set [email protected],[email protected] Where [email protected]" 

然后,@LogoName和@KeyCode提供的参数值。