Access は DBF (dBase) ファイルを開くことができますが、データを物理的に MDB 形式に変換する代わりに、DBF テーブル自体にリンクする機能があります。このようにして、DBF は MDB に「リンク」されます。
C#を使用してこのような方法でDBFファイルを添付することは可能ですか?
編集: Jet を使用し、MS Access を直接使用することは避けたいと思います。
おそらく、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
これは単なる提案ですが、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 を使用していないため、何を使用するかはわかりません。