2011-08-01 52 views
3

我有多個存儲在Access數據庫的附件數據類型中的文檔。使用DataReader,我需要讀取多個附件及其文件名,並將它們存儲在文件系統中。會感謝你的幫助......需要使用DataReader從Microsoft Access讀取多個附件的C#代碼使用DataReader的附件數據類型

+4

你有什麼試過自己,它在哪裏失敗?這不是問一個問題,它說明了一個問題。 – TJHeuvel

+0

我想知道爲什麼這篇文章被關閉......其實,這裏的問題很明顯。 Shahid需要一個解決方案來獲取OLE DB上的附件。問題在於,數據存儲在Access特定數據類型列(附件類型)中並不容易。 ADO.NET只獲取用分號分隔的文件名列表(只是文件名而不是完整路徑)。 Sharid想知道是否有可能獲得**實際的**文件數據(字節)和完整的文件名,以便他可以在.NET端恢復文件。 –

+2

附件存儲在Access數據庫本身內,只能從數據庫或查詢系統表(例如MSysObjects)訪問。後者不可能通過ADO.NET,我想。
我會看一個解決方案,它將涉及通過存儲完整文件路徑和/或二進制數據在Access端構建自定義文件附件處理。
我打算給這個問題一個投票,因爲它是1)挑戰2)有趣的 –

回答

2

你得到了ADO.NET的唯一數據是附加文件的名稱的分號分隔的列表。此外,您將看到ADO.NET將該列類型識別爲字符串。所以,你不可能從列中獲得實際的二進制數據(在.NET一側)。

我建議你不要使用附件作爲Access中的數據類型,如果您需要訪問Access數據庫以外的該列中的數據。只需創建單獨的表來存儲所有附件[鏈接]。

+0

謝謝伊戈爾的回答。我會努力解決這個問題... –

3

我有一個類似的問題,這是我如何使用DAO解決它。

 var dbe = new DBEngine(); 
     Database db = dbe.OpenDatabase(@"C:\tmp\access database file.accdb"); 
     try 
     { 
      Recordset rstMain = db.OpenRecordset(
        "SELECT `Attachment` FROM `table name`", 
        RecordsetTypeEnum.dbOpenDynaset); 

      while (!rstMain.EOF) 
      { 
       Recordset2 rstAttach = rstMain.Fields["Attachment"].Value; 
       rstAttach.OpenRecordset(); 

       while (!rstAttach.EOF) 
       { 
        Field2 fldAttach = (Field2)rstAttach.Fields["FileData"]; 
        string fileName = rstAttach.Fields["FileName"].Value.ToString(); 
        fldAttach.SaveToFile(@"C:\tmp\" + fileName); 
        rstAttach.MoveNext(); 
       } 
       rstAttach.Close(); 
       rstMain.MoveNext(); 
      } 
      rstMain.Close(); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.ToString()); 
     } 

您應該包括頭using Microsoft.Office.Interop.Access.Dao;

+0

哇!它確實在工作。經過大約半天的搜索和嘗試。謝謝! – Martin