Как программно прикрепить файл DBF в Access?

Access может открывать файлы DBF (dBase), но вместо физического преобразования данных в формат MDB он имеет возможность ссылаться на саму таблицу DBF. Таким образом, DBF «связан» с MDB.

Можно ли таким образом прикрепить файл DBF с помощью С#?

Изменить: я хотел бы использовать Jet и избегать прямого использования MS Access.


person Filip Frącz    schedule 20.11.2008    source источник
comment
Под присоединением вы подразумеваете настройку связи связанной таблицы или что-то в этом роде?   -  person Mat Nadrofsky    schedule 20.11.2008
comment
Да, чтобы файл DBF был связан с MDB.   -  person Filip Frącz    schedule 20.11.2008


Ответы (2)


Возможно, этот код из Как быстро скопировать таблицы из источника ODBC в MS Access в рамках проекта C# могут помочь:

Функция VB, которую вам нужно поместить в MS Access, довольно проста и в основном вызывает метод TransferDatabase, передавая ему DSN (указывающий на исходную базу данных), имя исходной таблицы и имя целевой таблицы. Код выглядит следующим образом:

Public Function Import(dsnName As String, sourceTableName As String, targetTableName As String)
‘ if the table already existsm, delete it.
   On Error GoTo CopyTable
   DoCmd.DeleteObject acTable, targetTableName
CopyTable:
   DoCmd.TransferDatabase _
   acImport, _
   "ODBC Database", _
   "ODBC;DSN=" + dsnName, _
   acTable, _
   sourceTableName, _
   targetTableName
End Function

Изменение VBA для чтения acLink, а не acImport, должно разрешить связывание.

И затем код С#:

object accessObject = null;
try
{
   accessObject = Activator.CreateInstance(Type.GetTypeFromProgID("Access.Application"));

   accessObject.GetType().InvokeMember(
      "OpenCurrentDatabase",
      System.Reflection.BindingFlags.Default  System.Reflection.BindingFlags.InvokeMethod,
      null,
      accessObject,
      new Object[] { "AccessDbase.mdb" });

   accessObject.GetType().InvokeMember(
      "Run",
      System.Reflection.BindingFlags.Default  System.Reflection.BindingFlags.InvokeMethod,
      null,
      accessObject,
      new Object[] { "Import", "DSN Name", "Source table name", "Target table name" });

   accessObject.GetType().InvokeMember(
      "CloseCurrentDatabase",
      System.Reflection.BindingFlags.Default  System.Reflection.BindingFlags.InvokeMethod,
      null,
      accessObject,
      null);

   MessageBox.Show("Copy succeeded.");
}
catch (Exception ex)
{
   string message = ex.Message;
   while (ex.InnerException != null)
   {
      ex = ex.InnerException;
      message += "\r\n----\r\n" + ex.Message;
   }
   MessageBox.Show(message);
}
finally
{
   if (accessObject != null)
   {
      System.Runtime.InteropServices.Marshal.ReleaseComObject(accessObject);
      accessObject = null;
   }
}

Редактировать комментарии

Я не могу помочь с c #, но вот какой-то VBScript, который связывает таблицу из одной MDB в другую.

strLinkFile = "C:\Docs\Link.mdb"
strAccessFile = "C:\Docs\LTD.mdb"

'Create Link... '
Set cn = CreateObject("ADODB.Connection")
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
       "Data Source=" & strAccessFile & ";" & _
       "Persist Security Info=False"

Set adoCat = CreateObject("ADOX.Catalog")
Set adoCat.ActiveConnection = cn

Set adoTbl = CreateObject("ADOX.Table")

Set adoTbl.ParentCatalog = adoCat
adoTbl.Name = "LinkTable"

adoTbl.properties("Jet OLEDB:Link Datasource") = strLinkFile
adoTbl.properties("Jet OLEDB:Link Provider String") = "MS Access"
adoTbl.properties("Jet OLEDB:Remote Table Name") = "Table1"
adoTbl.properties("Jet OLEDB:Create Link") = True

'Append the table to the tables collection '
adoCat.Tables.Append adoTbl

Он изменен с: http://support.microsoft.com/kb/240222.

person Fionnuala    schedule 20.11.2008
comment
Итак, если я ошибаюсь, правильно, для этого потребуется наличие доступа и библиотек автоматизации доступа. Можно ли добиться связывания без использования доступа? - person Filip Frącz; 20.11.2008
comment
да. Я хотел бы избежать использования самого приложения Access — пользователи моего кода могут не обязательно устанавливать его, а Jet практически вездесущ. - person Filip Frącz; 20.11.2008
comment
Я добавил скрипт, использующий Jet. - person Fionnuala; 20.11.2008

Это всего лишь предложение, но как насчет ссылки на DBF из Access, а затем посмотрите на строку подключения, которую Access использует для доступа к данным. Чтобы это работало только с Jet, вам потребуется ISAM, который Access использует для доступа к данным xBase. Однако я точно не знаю, является ли это компонентом Access или компонентом Jet.

Вот что я получаю для строки подключения, когда я связываюсь с DBF с Access 97 (и результаты идентичны с Access 2003):

dBase IV;HDR=NO;IMEX=2;DATABASE=C:\Path

В таблице MSysObjects это находится в столбце CONNECT, а имя файла dbf — в столбце DATABASE. Ссылки на данные Jet не имеют ничего в столбце CONNECT и только в столбце DATABASE, но свойство .Connect для tabledef, которое является ссылкой на таблицу Jet в другой MDB, такое же, как и в столбце Database.

Итак, я не уверен, что именно вы должны предоставить в качестве строки подключения, но ConnectionStrings.com есть предложения. Однако они не используют Jet для доступа к данным, поэтому я просто не уверен, что вы будете использовать.

person David-W-Fenton    schedule 21.11.2008