【问题标题】:Problem in saving image to database from picturebox. VB.Net 2008. Framework 3.5将图像从图片框保存到数据库时出现问题。 VB.Net 2008. 框架 3.5
【发布时间】:2011-04-01 16:28:28
【问题描述】:

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

我的代码通过确定按钮插入/更新数据并通过列表框填充它 双击如下:

私有 ms 作为 MemoryStream 私有 arrImage() 作为字节 私有连接作为 SqlConnection 私有 cmd 作为 SqlCommand Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) 处理 MyBase.Load '绑定列表框的方法。 BindListBox(lst, "Select Keycode,LogoName from tbltest", "Logoname", "keycode") 标签 = “插入” 结束子 Private Sub lst_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) 处理 lst.DoubleClick 作为 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 = 新的 MemoryStream(arrImage) pic.Image = Image.FromStream(ms) ms.Close() 别的 pic.Image = 没有 pic.Invalidate() 万一 标签 = “更新” 万一 博士关闭() 关闭连接() arrImage = 没有 ms = 无 结束子 Private Sub btnOk_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 处理 btnOk.Click 将 com 调暗为 SqlCommand 将 strSql 调暗为字符串 如果标签 = “插入” 那么 strSql = "插入 tbltest (logoname,logo) 值 ('" & Trim(txtLogoName.Text) & "',@Logo)" 别的 strSql = "更新 tbltest set logoname='" & Trim(txtLogoName.Text) & "',Logo=@Logo where keycode=" & lst.SelectedValue 万一 com = CreateCommand(strSql) com.Parameters.Add(New SqlParameter("@Logo", SqlDbType.Image)) If Not pic.Image is nothing then ms = 新的 MemoryStream() pic.Image.Save(ms, pic.Image.RawFormat) arrImage = ms.GetBuffer ms.Close() com.Parameters("@Logo").Value = arrImage 别的 com.Parameters("@Logo").Value = DBNull.Value 万一 如果 com.ExecuteNonQuery = 1 那么 关闭连接() BindListBox(lst, "Select Keycode,LogoName from tbltest", "Logoname", "keycode") pic.Image = 没有 pic.Invalidate() txtLogoName.Clear() 标签 = “插入” 万一 arrImage = 没有 ms = 无 strSql = 无 结束子 Private Sub btnBrowse_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 处理 btnBrowse.Click 用 dlg .Filter = "所有文件|*.*|位图|*.bmp|GIF|*.gif|图标|*.ico|JPEG|*.jpg|PNG|*.png" .FilterIndex = 5 结束于 如果 dlg.ShowDialog() = DialogResult.OK 那么 pic.Image = Image.FromFile(dlg.FileName) 结束子 公共子集连接() 尝试 conn = New SqlConnection("数据源=MyServer;初始目录=TestDB;用户ID=sa;密码=;") conn.Open() 抓住前任作为例外 消息框(例如消息) 结束尝试 结束子 公共子 closeconnection() 连接关闭() 结束子 公共函数 CreateCommand(ByVal 查询作为字符串)作为 SqlCommand 设置连接() 暗淡命令作为新的 SqlCommand(query, conn) 返回命令 结束功能 公共函数 CreateReader(ByVal query As String) As SqlDataReader 昏暗阅读器作为 SqlDataReader 设置连接() cmd = CreateCommand(查询) 阅读器 = cmd.ExecuteReader() 返回读者 结束功能

【问题讨论】:

  • 你到底想做什么?您想将图像保存到数据库还是遇到其他问题?

标签: vb.net visual-studio-2008


【解决方案1】:

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

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

2019 年更新:

还有用于存储基于文件的数据的 Sql Server 选项,在此链接中描述:https://docs.microsoft.com/en-us/sql/relational-databases/blob/compare-options-for-storing-blobs-sql-server?view=sql-server-ver15

【讨论】:

    【解决方案2】:

    使用参数。改变这个:

    strSql = "Update tbltest set logoname='" & Trim(txtLogoName.Text) & "',Logo=@Logo Where keycode=" & lst.SelectedValue
    

    strSql = "Update tbltest set logoname=@LogoName,Logo=@Logo Where keycode=@KeyCode"
    

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

    【讨论】:

      猜你喜欢
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-16
      相关资源
      最近更新 更多