Программное управление типизированным полем Microsoft Access с помощью .NET - PullRequest
7 голосов
/ 23 апреля 2009

Access добавил новый тип данных в версии 2007 года - тип вложения. В настоящее время мы работаем над приложением WinForms с .NET 3.5 (C #), которое использует базу данных Access 2007. Мы хотим иметь возможность добавлять новые вложения через интерфейс WinForms. Я не могу найти какую-либо информацию о том, как вставить или выбрать данные вложения с .NET. Я действительно пытался использовать DAO (версия 12), но, похоже, методы обсуждаемого здесь не были в SaveToFile или LoadFromFile: http://msdn.microsoft.com/en-us/library/bb258184.aspx

Итак, как я могу получить вложения с .NET?

Ответы [ 4 ]

5 голосов
/ 17 ноября 2009

Я, наконец, получил эту работу в C #, используя ссылку на 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();

Это добавит test.docx к полю Attachment «AttachmentFieldName» в таблице «TableWithAttachmentField». Стоит отметить, что попытка добавить один и тот же файл дважды приведет к ошибке.

1 голос
/ 23 апреля 2009

Интересный вопрос. Я не использую A2007, но у меня установлена ​​среда выполнения, поэтому я воспользовался браузером объектов Access, чтобы посмотреть, что там. Я обнаружил кое-что действительно странное - есть два объекта FIELD, Field и Field2. Функции вложения являются членами Field2, но не Field. Итак, мое предложение было бы, что, возможно, вам нужно преобразовать это:

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

примерно так:

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

Теперь, я не знаю, решит ли это проблему для вас, но мне кажется, что, учитывая два объекта Field с различными свойствами / методами / членами, вам необходимо четко указать, какой объект Field вы используете. с помощью. Пример кода, который вы цитируете, специально предназначен для использования в Access, и, возможно, Access что-то делает для автоматического устранения различий между двумя объектами (возможно, он использует объект Field по умолчанию для баз данных не-ACCDB и объект Field2 для файлов ACCDB). *

0 голосов
/ 23 июня 2009

Я изо всех сил пытался сделать то же самое. Есть ссылка, которую вы можете включить в свой проект на «Microsoft.Office.Interop.Access.Dao», которая даст вам интерфейсы Recordset2 и Field2, но без классов реализации.

Это примерно, насколько я получил, я буду публиковать больше раз / если я выясню это ...

Мне не удалось заставить это работать в C #, поэтому я перешел к другому решению. Хотелось бы знать, как это сделать, если кто-то это поймет.

0 голосов
/ 22 июня 2009

Посмотрите на эту запись в блоге Access team В основном в нем есть то, что Дэвид предлагает с некоторым поворотом. Он устанавливает объект типа Recordset2 равным значению поля вложения. Затем добавляет запись к этому набору записей и помещает содержимое файла в эту новую запись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...