2009-04-22 18 views
7

L'accesso ha aggiunto un nuovo tipo di dati nella versione 2007, il tipo Allegato. Attualmente stiamo lavorando a un'applicazione WinForms con .NET 3.5 (C#) che utilizza un database Access 2007. Vogliamo essere in grado di aggiungere nuovi allegati tramite l'interfaccia di WinForms. Non riesco a trovare alcuna informazione su come inserire o selezionare i dati degli allegati con .NET. Ho provato a utilizzare DAO (versione 12) ma non sembra avere i metodi SaveToFile o LoadFromFile discussi qui: http://msdn.microsoft.com/en-us/library/bb258184.aspxGestione programmata del campo Microsoft Access Attachment con .NET

Quindi, come posso ottenere gli allegati con .NET?

risposta

1

Interessante domanda. Non uso A2007, ma ho installato il runtime, quindi ho usato il browser degli oggetti Access per vedere cosa c'è dentro. Ho scoperto qualcosa di veramente strano: ci sono due oggetti FIELD, Field e Field2. Le funzioni di allegato sono membri di Field2 ma non Field. Quindi, il mio suggerimento sarebbe che forse quello che dovete fare è convertire questo:

Recordset.Fields("FileData").LoadFromFile(<filename>) 

a qualcosa di simile:

Dim rs As DAO.Recordset 
Dim fld2 As DAO.Field2 

Set rs = CurrentDb.OpenRecordset("[SQL]") 
Set fld2 = Recordset.Fields("FileData") 
fld2.LoadFromFile(<filename>) 

rs.Close 
Set fld2=Nothing 

Ora, io non so se quello di correggere il problema per tu, ma mi sembra che dati i due oggetti Field con proprietà/metodi/membri diversi, devi essere esplicito su quale oggetto Field stai usando. L'esempio di codice che citi è specifico per l'uso in Access e forse Access fa qualcosa per risolvere automaticamente le differenze tra i due oggetti (forse usa l'oggetto Field per impostazione predefinita per i database non ACCDB e l'oggetto Field2 per i file ACCDB).

0

Guarda questo articolo sullo Access team blog Ha sostanzialmente quello che David sta suggerendo con un po 'di twist. Imposta un oggetto di tipo Recordset2 uguale al valore del campo allegato. Quindi aggiunge un record a quel recordset a mette il contenuto del file in quel nuovo record.

0

Ho faticato per provare a fare la stessa cosa. C'è un riferimento che puoi includere nel tuo progetto in "Microsoft.Office.Interop.Access.Dao" che ti procurerà le interfacce Recordset2 e Field2, ma nessuna classe di implementazione.

che è circa per quanto ho ottenuto, vi posterò una volta di più/se ho capirlo ...

non ero in grado di ottenere questo lavoro in C#, così sono passato a un soluzione diversa. Mi piacerebbe sapere come farlo anche se qualcuno lo capisce.

+0

Provare a qualificare ogni istanza in questo modo: --- DAO.DBEngine db = new DAO.DBEngine(); – MasterOfStupidQuestions

5

Ho finalmente ottenuto questo lavoro in C# utilizzando un riferimento a Microsoft.Office.Interop.Access.Dao.

DBEngine dbe = new DBEngine(); 
Database db = dbe.OpenDatabase("C:\\SomeDatabase.accdb", false, false, ""); 
Recordset rs = db.OpenRecordset("SELECT * FROM TableWithAttachmentField", RecordsetTypeEnum.dbOpenDynaset, 0, LockTypeEnum.dbOptimistic); 
rs.MoveFirst(); 
rs.Edit(); 
Recordset2 rs2 = (Recordset2)rs.Fields["AttachmentFieldName"].Value; 
rs2.AddNew(); 

Field2 f2 = (Field2)rs2.Fields["FileData"]; 

f2.LoadFromFile("C:\\test.docx"); 
rs2._30_Update(); 
rs2.Close(); 

rs._30_Update(); 
rs.Close(); 

Questo aggiungerà test.docx al campo Allegato "AttachmentFieldName" nella tabella "TableWithAttachmentField". Una cosa da notare è che il tentativo di aggiungere lo stesso file due volte genera un errore.

Problemi correlati