2

Access は DBF (dBase) ファイルを開くことができますが、データを物理的に MDB 形式に変換する代わりに、DBF テーブル自体にリンクする機能があります。このようにして、DBF は MDB に「リンク」されます。

C#を使用してこのような方法でDBFファイルを添付することは可能ですか?

編集: Jet を使用し、MS Access を直接使用することは避けたいと思います。

4

2 に答える 2

3

おそらく、C# プロジェクト内で ODBC ソースから MS Access にテーブルをすばやくコピーする方法 の次のコードが役立つかもしれません。

MS Access に組み込む必要がある VB 関数は非常に単純で、基本的には、DSN (ソース データベースを指す)、ソース テーブル名、およびターゲット テーブル名を渡すことによって TransferDatabase メソッドを呼び出します。コードは次のとおりです。

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

acImport ではなく acLink を読み取るように VBA を変更すると、リンクが許可されます。

そして、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;
   }
}

再コメントを編集

私は c# を手伝うことはできませんが、ある MDB から別の MDB にテーブルをリンクする VBScript を次に示します。

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

于 2008-11-20T15:14:47.383 に答える
1

これは単なる提案ですが、Access から DBF にリンクする場合はどうでしょうか。Access がデータを取得するために使用する接続文字列を見てください。これを Jet だけで動作させるには、Access が xBase データへのアクセスに使用する ISAM が必要です。ただし、それが Access コンポーネントなのか Jet コンポーネントなのかはわかりません。

Access 97 で DBF にリンクすると、接続文字列として次のようになります (結果は Access 2003 と同じです)。

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

MSysObjects テーブルでは、それは CONNECT 列にあり、dbf ファイル名は DATABASE 列にあります。Jet データへのリンクは、CONNECT 列には何もなく、DATABASE 列だけにありますが、別の MDB の Jet テーブルへのリンクである tabledef の .Connect プロパティは、Database 列にあるものと同じです。

したがって、接続文字列として何を指定するか正確にはわかりませんが、ConnectionStrings.comに提案があります。ただし、それらはデータへのアクセスに Jet を使用していないため、何を使用するかはわかりません。

于 2008-11-21T04:36:59.027 に答える