2016-04-11 6 views
1

テキストボックステキストから入力されるパブリック接続文字列が必要です。フィールドイニシャライザを使用したパブリックSQL接続文字列

public static string conString ="server=" + tb_serverinfo.Text + "; database=master;user=" + tb_user.Text + ";pwd=" + tb_password.Text + ";Connection Timeout=5"; 

これは、フィールド初期化子が非静的フィールド、メソッド、またはプロパティ「を参照することはできません原因

重大度コード説明プロジェクトファイルの行の抑制状態 エラーCS0236

に動作しませんDatabase_Tool.tb_serverinfo 'データベースツールC:\ Users ... 120アクティブ

私は自分の問題を解決するために何が必要なのか分かりません。

最終的に私はtryステートメントとconn.openをどこでも行うことができますが、私は後でそれを試してみます。

ありがとうございます!

+0

基本的に静的フィールドとインスタンスフィールドの違いについてお読みになることをお勧めします。パブリックSqlConnection変数を使用しないことをお勧めします。代わりに、必要に応じてSqlConnectionを開き、必要な場所から呼び出して、その操作を完了したら接続を閉じるメソッドを使用できます。 –

+0

@JonSkeet私はそれに感謝します。それはまさに私がやりたいことです。試しに開いて閉じます。 – SCramphorn

答えて

3

エラーはかなり明確です。静的(すべてのインスタンスで同じ)変数を非静的(異なるインスタンスでは異なります)のデータから初期化しようとしています。 ...

public string conString 
{ 
    get{ 
     return "server=" 
      + tb_serverinfo.Text 
      + "; database=master;user=" 
      + tb_user.Text 
      + ";pwd=" 
      + tb_password.Text 
      + ";Connection Timeout=5"; 
    } 
} 

は結局、私は公共のSQL接続を希望

悪いアイデアを:あなたは、接続文字列を構築する非静的関数やプロパティを必要とするような音。接続は.NETによってプールされるため、一般的には高価なプロセスではありません。あなたの "共有"接続が開いているかどうかを把握しようとするエネルギーを無駄にするのではなく、接続文字列を設定するなど必要なときに作成するだけでなく、開いたり、自分のものを処理したり、それが完了したら)。

それを行うための効率的な方法は、usingブロックである:

using(var conn = new SqlConnection(conString)) 
{ 
    using(var cmd = new SqlCommand(sql, conn)) 
    { 
     conn.Open(); 
     ... use the command 
    } // cmd is disposed 
} // conn is disposed 

その方法のすべては例外があっても、きれいに清掃されます。

+0

ありがとうございました! 接続のこれらのパラメータを使用するかどうかを判断するif文を使用できますか。私は、ユーザーがSQL認証/ Windowsのチェックボックスを持つことができるようにしたいと思います。つまり、checkbox.ticked = trueの場合、この文字列を使用します。 – SCramphorn

+0

もちろん、2つの異なるプロパティ、または可能なすべてのパラメータを取り、適切な文字列を返す関数などがあります。何かを試して、特定の問題に戻ってくる。 –

関連する問題