2016-02-05 133 views
0

我用下面的代碼:將文件添加附件列在Access數據庫

Public Sub Add_File(Update_Table As Integer) 

    Dim Fpath = My.Settings.Database_Connection_String 



    Dim fd As OpenFileDialog = New OpenFileDialog() 
    Dim strFileName As String 

    fd.Title = "Open File Dialog" 
    fd.InitialDirectory = "C:\" 
    fd.Filter = "All files (*.*)|*.*|All files (*.*)|*.*" 
    fd.FilterIndex = 2 
    fd.RestoreDirectory = True 
    fd.Multiselect = True 


    If fd.ShowDialog() = DialogResult.OK Then 
     Dim FileRow 
     Try 
      FileRow = Form1.Projects_DGV.SelectedCells.Item(0).RowIndex 
     Catch ex As Exception 
      FileRow = 0 
     End Try 

     Dim FileX = Form1.Projects_DGV.Item(0, FileRow).Value 




     For Each file As String In fd.FileNames 

      strFileName = file 



      ' this code requires that your project have the following COM Reference: 
      '  Microsoft Office 14.0 Access Database Engine Object Library 

      Dim dbe As New Microsoft.Office.Interop.Access.Dao.DBEngine 
      Dim db As Microsoft.Office.Interop.Access.Dao.Database = dbe.OpenDatabase(My.Settings.Database_Location) 
      Dim rstRecord As Microsoft.Office.Interop.Access.Dao.Recordset = db.OpenRecordset(_ 
        "SELECT * FROM [Projects] WHERE [Project ID]=" & FileX, _ 
        Microsoft.Office.Interop.Access.Dao.RecordsetTypeEnum.dbOpenDynaset) 
      rstRecord.Edit() 
      Dim rstAttachments As Microsoft.Office.Interop.Access.Dao.Recordset2 
      If Update_Table = 1 Then 
       rstAttachments = rstRecord.Fields("Invoice").Value 
      ElseIf Update_Table = 2 Then 
       rstAttachments = rstRecord.Fields("Software Handover").Value 
      ElseIf Update_Table = 3 Then 
       rstAttachments = rstRecord.Fields("Other Documents").Value 
      ElseIf Update_Table = 4 Then 
       rstAttachments = rstRecord.Fields("Project Documents").Value 
      End If 



      rstAttachments.AddNew() 
      Dim AttachmentData As Microsoft.Office.Interop.Access.Dao.Field2 = rstAttachments.Fields("FileData") 
      AttachmentData.LoadFromFile(strFileName) 
      rstAttachments.Update() 
      rstAttachments.Close() 
      rstRecord.Update() 
      rstRecord.Close() 
      db.Close() 

     Next 
     setupdatagrids() 
    End If 
End Sub 

該代碼應該讓我添加文件作爲附件到一個數據庫,它的工作原理在另外兩個項目中很好,但由於某種原因現在不能工作。該代碼失敗在這條線:

Dim rstRecord As Microsoft.Office.Interop.Access.Dao.Recordset = db.OpenRecordset(_ 
         "SELECT * FROM [Projects] WHERE [Project ID]=" & FileX, _ 
         Microsoft.Office.Interop.Access.Dao.RecordsetTypeEnum.dbOpenDynaset) 

與錯誤:

An unhandled exception of type 'System.Runtime.InteropServices.COMException' occurred in Alveare - Complete Management Tool.exe

Additional information: Too few parameters. Expected 1.

任何人有任何想法,爲什麼這會是這樣,因爲我傳遞參數?

感謝

+0

是否有可能'FileX'的值包含空格,並且正在搞砸SQL的執行? – jmcilhinney

+0

無論如何應該在SQL中引用'FileX'的值?除非它是一個整數,否則它應該。我也注意到你必須有'Option Strict Off',這從來都不好。它允許各種各樣的問題偷偷摸摸地通過可能更早被捕獲的其他問題。 – jmcilhinney

+0

啊,在所有其他項目中,數據庫的主鍵始終是一個ID整數,但是在這個數據庫中,例如它是一個字符串「F002-X」。爲了解決這個問題,我需要改變什麼? – SilverShotBee

回答

2

由於Project ID列包含文本而不是數字,改變這種:

"SELECT * FROM [Projects] WHERE [Project ID]=" & FileX 

這樣:

"SELECT * FROM [Projects] WHERE [Project ID]='" & FileX & "'" 

或本:

String.Format("SELECT * FROM [Projects] WHERE [Project ID]='{0}'", FileX) 

我的偏好是第二種選擇。

+0

謝謝,我用你的第一個選項,它的工作原理 – SilverShotBee