我正在创建一个程序,在Visual Studio 2017社区中从VB.net向Access数据库添加有关人员的信息。 它的工作方式是,我将在表单中使用两个标签页(一个用于添加记录;另一个用于更新)。我在添加实际记录或更新它时没有任何问题,所以不用担心。
我的主要计划是将图像添加到每个新记录或现有记录中并将图像保存在那里,以便在更新标签中将该图像显示在图片框上(如果该人员是' s记录被选中。
以下是我的“浏览”代码。我添加记录时按钮:
OpenFileDialog1.Filter = "images files (*.bmp;*.jpg;*.gif;*.png)|*.bmp;*.jpg;*.gif;*.png"
If OpenFileDialog1.ShowDialog = DialogResult.OK Then
PicPictureBox.Image = Image.FromFile(OpenFileDialog1.FileName)
Else
MessageBox.Show("Nothing was selected.")
End If
我向db添加记录时的代码:
Dim birthdate As Date
Date.TryParse(AddBirth.Text, birthdate)
TblFriendsTableAdapter.AddNewRow(AddFirstName.Text, AddLastName.Text,
AddState.Text, txtAddCity.Text,
AddCountry.Text, txtAddPhone.Text,
AddInterest.Text, birthdate, PicPictureBox.Image.ToString)
Me.Validate()
Me.TblFriendsBindingSource.EndEdit()
TblFriendsTableAdapter.Update(FriendsDataSet.tblFriends)
Me.TblFriendsTableAdapter.Fill(Me.FriendsDataSet.tblFriends)
最初,当添加记录时,图像被"保存"到数据库,但只在图片字段上读取为System.Drawing.Bitmap。 我应该在代码上使用文件路径吗?
答案 0 :(得分:0)
如果要保存并检索图像,则需要实际存储图像。当您在ToString
对象上调用Image
时,您只需将完全限定类型作为字符串(这就是您看到System.Drawing.Bitmap
的原因)。因此,您需要做的是将图像以二进制格式保存到数据库中。您可以使用BLOB(oleObject
)字段来保存图像数据。请注意,这确实存在一些缺陷,其中之一就是它会大大增加数据库的大小。要获取图像数据,只需使用Save
类的Image
方法。您可以将数据保存到MemoryStream,然后从流中抓取bytes
以存储在数据库中。
为了进一步说明为什么要存储图像信息(在数据库中或您可以访问的其他文件系统位置),请考虑如果您只是存储从UI中选择的位置会发生什么。图像可以在文件系统上替换,图像可以删除,如果您从另一台机器访问数据库(和您的应用程序)图像不存在(或者某些其他图像具有相同的本地文件路径,并且不是你所期待的。)
这是VB中的一个片段,展示了如何将图像作为字节数组。
Dim result As Byte()
Using ms As New MemoryStream
PicPictureBox.Image.Save(ms, PicPictureBox.Image.RawFormat)
result = ms.ToArray()
End Using
现在您可以获取数组并将其存储在数据库中。当您从数据库中将其拉回时,您可以使用与保存类似的过程,方法是将字节加载回MemoryStream
并使用Image.FromStream
方法加载它。