2009-04-22 8 views
7

Access agregó un nuevo tipo de datos en la versión de 2007: el tipo de archivo adjunto. Actualmente estamos trabajando en una aplicación WinForms con .NET 3.5 (C#) que utiliza una base de datos de Access 2007. Queremos poder agregar nuevos archivos adjuntos a través de la interfaz de WinForms. Parece que no puedo encontrar información sobre cómo insertar o seleccionar datos adjuntos con .NET. Intenté usar DAO (versión 12) pero no parecía tener los métodos SaveToFile o LoadFromFile discutidos aquí: http://msdn.microsoft.com/en-us/library/bb258184.aspxAdministrando programáticamente el campo de tipo adjunto de Microsoft Access con .NET

Entonces, ¿cómo puedo obtener los archivos adjuntos con .NET?

Respuesta

1

Interesante pregunta. No uso A2007, pero tengo el tiempo de ejecución instalado, así que utilicé el navegador de objetos de Access para ver qué hay allí. Descubrí algo realmente extraño: hay dos objetos FIELD, Field y Field2. Las funciones de archivo adjunto son miembros de Field2 pero no de Field. Por lo tanto, mi sugerencia sería que tal vez lo que hay que hacer es convertir esto:

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

a algo como esto:

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 

Ahora, no sé si eso va a corregir el problema para usted, pero me parece que dados los dos objetos de Campo con diferentes propiedades/métodos/miembros, debe ser explícito sobre qué objeto de Campo está utilizando. El ejemplo de código que cita es específicamente para uso en Access y quizás Access hace algo para resolver automáticamente las diferencias entre los dos objetos (tal vez usa el objeto Field de forma predeterminada para las bases de datos no ACCDB y el objeto Field2 para archivos ACCDB).

0

Mire este escrito en el Access team blog Tiene básicamente lo que David está sugiriendo con un poco de un giro. Establece un objeto de tipo Recordset2 igual al valor del campo de archivo adjunto. Luego agrega un registro a ese conjunto de registros a coloca el contenido del archivo en ese nuevo registro.

0

He estado luchando para intentar hacer lo mismo. Hay una referencia que puede incluir en su proyecto en "Microsoft.Office.Interop.Access.Dao" que le proporcionará las interfaces Recordset2 y Field2, pero no las clases de implementación.

Eso es lo más lejos que he llegado, voy a publicar más una vez/si lo averigüe ...

yo no era capaz de conseguir este trabajo en C#, por lo que se trasladaron a una solución diferente Sin embargo, me encantaría saber cómo hacer esto si alguien se da cuenta.

+0

Pruebe calificando cada instancia de esta manera: --- DAO.DBEngine db = new DAO.DBEngine(); – MasterOfStupidQuestions

5

Finalmente conseguí esto trabajando en C# usando una referencia 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(); 

Esto añadirá test.docx al campo Anexo "AttachmentFieldName" en la tabla "TableWithAttachmentField". Una cosa a tener en cuenta es que intentar agregar el mismo archivo dos veces generará un error.

Cuestiones relacionadas