【问题标题】:Save/open OLE object from .mdb in vb winform在 vb winform 中从 .mdb 保存/打开 OLE 对象
【发布时间】: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。我不知道如何将文件放入内存字符串。是的,我想将文件的内容保存到数据库,以便用户可以在以后检索文档。

标签: vb.net winforms ms-access


【解决方案1】:

经过两周的搜索和尝试一堆方法后,我得到了它的工作。上面的代码已更正,可用于将文件上传到 .mdb 文件。下面的代码将检索它。是的,我知道将文件保存到 mdb 不是最好的,但只有几个 docs 或 pdf,我需要将它们全部放在一个文件中以便用户之间轻松共享。

  Private Builder As New OleDbConnectionStringBuilder With _
  { _
      .DataSource = IO.Path.Combine(Application.StartupPath & "\data.mdb"), _
      .Provider = "Microsoft.Jet.OleDb.4.0" _
  }

Private Sub btnGetfile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGetfile.Click
    Dim selfile As String = fileDgv.CurrentCell.Value.ToString

    Dim cn As New OleDbConnection With {.ConnectionString = Builder.ConnectionString}
    Dim cmd As New OleDbCommand With _
        { _
            .Connection = cn, _
            .CommandText = "SELECT photo FROM tblstudent WHERE name='" & selfile & "'" _
        }
    Dim NoDataList As New List(Of String)


    Dim dr As OleDbDataReader = Nothing
    Dim FileStream As System.IO.FileStream
    Dim Reader As OleDbDataReader
    Dim Data() As Byte = Nothing
    Dim Writer As System.IO.BinaryWriter = Nothing
    Dim bufferSize As Integer = 1000
    Dim buffer(bufferSize - 1) As Byte
    Dim startIndex As Long = 0
    Dim numberOfBytes As Long = 0
    cn.Open()
    Reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)
    Reader.Read()
    FileStream = New System.IO.FileStream(
        IO.Path.Combine("C:\temp3", "temp", selfile),
        System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write)
    Writer = New System.IO.BinaryWriter(FileStream)
    Do
        numberOfBytes = Reader.GetBytes(0, startIndex, buffer, 0, bufferSize)
        If numberOfBytes = 0 Then
            Exit Do
        End If
        Writer.Write(buffer, 0, CInt(Fix(numberOfBytes)))
        startIndex += numberOfBytes
    Loop While True
    Writer.Flush()
    If Writer IsNot Nothing Then
        Writer.Close()
    End If
    If FileStream IsNot Nothing Then
        FileStream.Close()
    End If
    If Reader IsNot Nothing Then
        Reader.Close()
    End If
    cn.Close()
    MessageBox.Show("Done")

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多