【发布时间】:2013-10-04 12:07:47
【问题描述】:
我正在尝试向我的 vb winform 程序添加一个功能,用户可以将文件(.doc、.docx、.jpg、.pdf)附加到包含其他文本数据的 mdb 文件中。二进制文件和文件名存储在数据库中。带路径的文件名作为变量“fpath”传递。下面是我到目前为止所拥有的(它现在正在工作,这意味着它保存了文件名和二进制数据)。现在,用户如何打开保存的文件?而且,如果它是 .doc 或 PDF 等文件,如何让默认关联程序打开它? .有人可以帮我做剩下的吗?
这里是存储 OLE 对象的代码:
Private Sub btnClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClear.Click
'data connection
Dim cn As New OleDb.OleDbConnection
cn.ConnectionString = "Provider=Microsoft.Jet.OleDb.4.0; Data Source=" & _
Application.StartupPath & "\data.mdb"
cn.Open()
'file name without path
Dim flName As String = filename.Text
'open file from the disk (file path is the path to the file to be opened)
Using fileStream As FileStream = File.OpenRead(fpath)
'create new MemoryStream object
Dim memStream As New MemoryStream()
memStream.SetLength(fileStream.Length)
'read file to MemoryStream
fileStream.Read(memStream.GetBuffer(), 0, CInt(Fix(fileStream.Length)))
Dim strImage As String = "?"
Dim arr As Byte()
arr = memStream.GetBuffer
Dim cmd As New OleDb.OleDbCommand
cmd.Connection = cn
cmd.CommandText = "INSERT INTO tblstudent(name, photo) VALUES( ?, ?)"
cmd.Parameters.Add("@name", OleDbType.Char).Value = flName
cmd.Parameters.Add("@photo", OleDb.OleDbType.Binary).Value = arr
cmd.ExecuteNonQuery()
MsgBox("Data save successfully!")
cn.Close()
End Using
End Sub
【问题讨论】:
-
你的
MsgBox来得太早了,它应该在cmd.ExecuteNonQuery()之后,这里应该使用Try/Catch。我认为您还必须存储文件名。 -
我添加了 try/catch 并切换了 msg 框的顺序。该代码不会将任何内容保存到数据库中,但它现在不会引发异常。不知道还能做什么
-
您的代码和问题文本不匹配。文本说“用户将单击一个按钮浏览到文件,并且文件名和路径显示在 lable1 中”,但代码不会尝试保存文件名和路径(它将文件读入空
System.IO.File.ReadAllBytes(flName)根本不使用您创建的流,然后尝试将该流的未初始化、不存在的内容存储到数据库中)。你想做什么?保存文件名和路径?保存文件的二进制内容?请编辑以澄清您在此处向我们寻求帮助的内容。 -
我还要指出,在 mdb s= 中存储任意二进制文件不是一个好计划 - 在几百个文档之后,mdb 将是巨大的,并且您的所有数据库操作都会变慢并且随着磁盘搅动更多而变慢。将文件存储在目录中,并将其路径存储在 mdb 中...
-
谢谢,我编辑了上面的。我不确定如何将路径读入内存字符串。路径是字符串 flName。我不知道如何将文件放入内存字符串。是的,我想将文件的内容保存到数据库,以便用户可以在以后检索文档。