Как прикрепить файл DBF в Access программно? - PullRequest
2 голосов
/ 20 ноября 2008

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

Можно ли прикрепить файл DBF таким способом, используя C #?

Редактировать : Я хотел бы использовать Jet и не использовать MS Access напрямую.

Ответы [ 2 ]

3 голосов
/ 20 ноября 2008

Возможно, этот код из Как быстро скопировать таблицы из источника 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

А затем код C #:

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;
   }
}

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

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

Я не могу помочь с 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

1 голос
/ 21 ноября 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 для доступа к данным, поэтому я просто не уверен, что бы вы использовали.

...