2012-02-22 12 views
1

私は、Access 2007アプリケーションに接続できるWinforms C#アプリケーションを用意しました。基本的に、ユーザーはwinformsアプリケーションのボタンをクリックすると、実行しているMSアクセスアプリケーション内の特定のフォームに移動します。MS AccessアプリケーションとC#Winformsアプリケーションの間のリンク

これは可能ですか?

ありがとうございました

+1

これはおそらくあなたが探している答えではありませんが、 WinFormsでAccessアプリケーションを書き直してみませんか? – jrummell

+1

アクセスアプリケーションは、企業全体で日常業務を行うために使用される、大きなレガシーアプリケーションです。 winformsアプリは、実際にはAcessアプリの代わりに使われていますが、その一部にすぎません。ユーザーは、新しいアプリから既存のアプリにリンクバックする必要があります。 – user948060

答えて

0

はい、可能です。 DDEを使用する必要があります。醜い古い技術ですが、まだAccess 2007にあります。私はNDdeライブラリをcodeplexに使っています。

using (DdeClient client = new DdeClient("MSACCESS", "MyDB.accdb")) 
{ 
      String DdeCommand = 
      "[OpenForm frmNavigate,,,,,,UserOpenArgs]"; 
     try 
     { 
      client.Connect(); 
      client.Execute(DdeCommand, 5000); 
     } 
     catch (NDde.DdeException ex) 
     { 
      // MessageBox.Show(ex.Message); 
      Logger.Write(ex.ToString()); 
     } 
} 
+0

優秀、ありがとう、私はNDdeをチェックアウトします。明確にするために、Accessアプリケーションは、MS SQLデータベースに接続されたアクセスフォームです。 .accdbファイルはありません...それは何かを変えますか? – user948060

+0

あなたのアクセスフォームは正しいと思われるaccdbまたはaccdeファイルが必要ですか?私たちはSQLServerのリンクテーブルを使用し、開発のためのaccdbファイルを持っていて、それを展開用のaccdeファイルに変換しました。どちらでも動作します。 – user957902

+0

user957902:私はadpファイルを持っています。 – user948060

2

DDEを使用する代わりに、自動化を検討してください。関連するPIAライブラリのリファレンスを追加する必要があります。次に、Access開発者がAccess開発者にもっとよく知られているコードを追加する必要があります。

var access = new Access.Application(); 
access.OpenCurrentDatabase("MyDB.accdb"); 
access.OpenForm("frmNavigate"); 
+0

私は、オートメーションを使用すると、常にAccessの新しいインスタンスが開始されることがわかりました。 DDEは既に実行中のインスタンスを探します。 – user957902

+0

@ user957902あなたは 'System.Runtime.InteropServices.Marshal.GetActiveObject'で既存のインスタンスを取得できます(ただし、このアプローチにも問題があります)。例については、http://support.microsoft.com/kb/316126を参照してください。 – phoog

関連する問題