2016-05-11 1 views
0

私は他の多くの形式を開くメインウィンドウのフォームを持っています。すべてのフォームには、共通のOracleデータベース接続があります。C#でフォーム間のデータベース接続を共有する最善の方法は何ですか?

私はC#の新機能を使用しています(今まではビジュアルベーシックを使用していました)、これを達成するための最良の方法はわかりません。

潜在的なオプション:

  1. は、入力として、子フォームへの接続を渡します。
  2. メインウィンドウフォームを親フォームとして子フォームに渡し、そのメンバー変数の接続を使用します。
  3. 私が考えていない他のオプションです。

編集:機能を実行するサンプルクラスについては、@ C4ud3xの回答を参照してください。

+2

接続はすでにプールされています(https://msdn.microsoft.com/en-us/library/ms254502(v=vs.110).aspx)。それらを渡したり、開いたりしないでください単一の問合せでは、できるだけ早く最適なパフォーマンスを得るために破棄します。 –

+1

あなたは本当に 'ONE'接続を共有していますか?なぜ 'database.cs'のような新しいクラスを追加し、' open-> command-> close'プロセスを宣言し、それをすべてのフォームから使用するのですか? – C4u

+0

@ C4ud3xいい計画のようです。 –

答えて

7

オプション3:

接続を共有しないでください。複数の要求に対して接続を開いたままにしないでください(ただし、が直ちにになる)。接続を公開プロパティとして公開しないでください。

接続は.NETによってプールされるため、作成はコストのかかるプロセスではありません。必要なときに接続を作成し、使用してから廃棄します。これを行う有効な方法は、usingブロックです。あなたは中心的な場所がに使用される接続文字列を保存したい場合は

大丈夫です接続を作成 - あなたはその 1内の場所を保存するためにはapp.configまたはいくつかの他のメカニズムを使用することができます。

+0

接続を開くという構造を共有するのではなく、接続を渡すことについてhesが本当に考えていますか? – C4u

+4

@ C4ud3xはい、あります。それが質問の状態です。 "接続を渡す..."、 "...メンバー変数の接続を使用する"さらに、他のプラットフォームでは.NETのように接続をプールしない可能性があるため、それらを共有することで、これらのプラットフォームで何らかの利点が得られる可能性があります。 –

+0

いくつかの追加情報については、[Oracle Connection Pooling](https://msdn.microsoft.com/en-us/library/ms254502(v = vs.110).aspx#Anchor_2)のMSDNページへのリンクがあります。 。 –

0

接続を共有することは非常に危険です。とにかくそれをやりたければ、ここには可能な方法があります: あなたはこれを渡すインターフェイスを定義することができます。この方法で、後で共有するために他のプロパティを定義することができます。

public interface IMainWindow 
{ 
    Datebase Db; 
} 

あなたのメインウィンドウには、このインターフェイスを実装します。

public Window MainWindow : IMainWindow 
{ 
    public Database Db 
... 
} 

あなたに第二のウィンドウをのみ、このインターフェイスthorughtメインウィンドウにアクセスします。

public Window SecondWindow 
{ 
    private readonly IMainWindow Mw; 
    public SecondWindow(IMainWindow Mw) 
    { 
    this.Mw = Mw; 
    //Access the MainWindow database with Mw.Db 
    } 
} 
0

あなたは接続をパスして共有することができますが、それは推奨される方法ではありません。 1つのフォームが例外を閉じたり処理したりするのを忘れると、すべてのフォームに影響します。並列処理またはバックグラウンド処理に進むと、接続が使用中である可能性があります。

接続文字列を共有する必要があります。これは、ctorのフォームに渡す共有変数になります。

Connection con = new Connection(conString); 
try 
{ 
    con.Open(); 
    Command cmd = con.CreateCommand(); 
    // use command 
} 
catch(Exception Ex) 
{ 
} 
finally 
{ 
    con.Close(); 
} 

非常に高速です。推奨される方法は、可能な限り遅く開いて、できるだけ早く閉じて接続数を減らす方法です。

はい、データベース型クラスのすべてをラップすることができますが、私はちょうど直接使用するのが好きです。あなたは、データベースのもののために新しいクラスを追加し、このようなすべてのフォームからアクセスすることができwhats wrong with your questionについての説明のほかに、

0

:あなたのすべての変数を宣言する必要がwouldntはこの場合

// database.cs 
public static class Database 
{ 
    static string connectionString = "user=...pass=...db=...etc"; 

    public static void ExecuteQuery(string query) 
    { 
     // open connection 
     // send query 
     // close connection 
    } 
} 

// form1.cs 
public partial class Form1 : Form 
{ 
    public void doSomething() 
    { 
     Database.ExecuteQuery("Select something"); 
    } 
} 

// form2.cs 
public partial class Form1 : Form 
{ 
    public void anotherOne() 
    { 
     Database.ExecuteQuery("Update something"); 
    } 
} 

何かのインスタンスを形成するか、パスします。

また、ご使用のアプリケーションでは、清潔なopen -> send -> closeプロセスを気にする必要があります。

関連する問題