2013-09-28 1 views
2

내 vb winform 프로그램에 사용자가 파일 (.doc, .docx, .jpg, .pdf)을 첨부 할 수있는 기능을 추가하려고합니다. 다른 텍스트 데이터를 보유합니다. 이진 파일과 파일 이름은 DB에 저장됩니다. 경로가있는 파일 이름은 변수 'fpath'로 전달됩니다. 아래는 내가 지금까지 가지고있는 것입니다 (파일 이름과 바이너리 데이터를 저장한다는 의미입니다). 이제 어떻게 사용자가 저장된 파일을 열 수 있습니까? 그리고 .doc 또는 PDF 등의 경우 기본 연결 프로그램을 어떻게 열 수 있습니까? . 다른 사람이 나를 도와 줄 수 있습니까? 여기 vb winform에서 .mdb의 OLE 개체 저장/열기

는 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 
+0

'MsgBox'가 너무 일찍 왔기 때문에'cmd.ExecuteNonQuery()'다음에오고 Try/Catch를 사용해야합니다. 나는 파일 이름도 저장해야한다고 생각한다. – OneFineDay

+0

try/catch를 추가하고 msg 상자의 순서를 바꿨습니다. 이 코드는 db에 아무 것도 저장하지 않지만 예외를 던지지는 않습니다. 다른 무엇을 해야할지 확실하지 않습니다. – Cory

+0

코드와 질문 텍스트가 일치하지 않습니다. 텍스트는 "사용자가 단추를 클릭하여 파일을 탐색하면 파일 이름과 경로가 lable1에 표시됩니다"라고 표시되지만 코드는 파일 이름과 경로를 저장하지 않습니다 (파일을 아무것도 읽지 않음). 'System.IO.File.ReadAllBytes (flName)'을 사용하여 생성 한 스트림을 전혀 사용하지 않은 다음 해당 스트림의 초기화되지 않은 존재하지 않는 내용을 DB에 저장하려고 시도합니다. 너 뭐하려고하는거야? 파일 이름과 경로를 저장 하시겠습니까? 파일의 바이너리 내용을 저장 하시겠습니까? 여기에 대한 도움을 청합니다. –

답변

1

이 후 주, 나는 일을 얻었다. 위의 코드는 수정되어 .mdb 파일에 파일을 업로드하는 데 사용됩니다. 아래 코드는 그것을 검색 할 것입니다. 예, mdb에 파일을 저장하는 것이 가장 좋지는 않지만 몇 가지 문서 또는 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 
관련 문제