1

SqlConnectionSql Server 2008R2 Express Editionデータベースで開くにはどうすればよいか知りたいのですが。このバージョンのSqlにはRAMの使用とCPU使用の制限がありますので、SqlConnectionを開くには何かをベストに採用する必要があります。C#でSqlConnectionを開いたり閉じたりするのに最適なアプローチは何ですか

今私は、各メソッドの開始と終了時に接続をチェックしています。ここにその例があります。ここで

private void CheckValidId(string Id) 
    { 
     CheckConnectionStatus(); 

     try 
     { 
      sqlConnection.Open(); 
      sqlCommand = new SqlCommand("select * from ValidId where [email protected]", sqlConnection); 
      sqlCommand.Parameters.AddWithValue("@id", Id); 
      sqlDataReader = sqlCommand.ExecuteReader(); 
      While (sqlDataReader.Read()) 
      { 
       string Test = sqlDataReader["Id"].toString(); 
       MessageBox.Show("Value of Id : " , Test); 
      } 
     } 
     catch (Exception exp) 
     { 
      MessageBox.Show(exp.Message.ToString(), "Exception in CheckValidId"); 
     } 
     finally 
     { 
      CheckConnectionStatus(); 
     } 
    } 

は、この操作を実行するための最善のアプローチは何CheckConnectionStatus方法

private void CheckConnectionStatus() 
    { 
     if (sqlConnection.State == ConnectionState.Open) 
     { 
      sqlConnection.Close(); 
     } 
    } 

です。それは一度行って接続を処分するよう

おかげ

+0

以下の2つの回答があなたの正しい答えです。なぜなら、使用するステートメントを使いたい理由は、使い捨てであるからです。それは自動的に完了時に接続を閉じます –

+0

@ SimonPriceありがとう男 –

答えて

2

あなたの開け閉めのパターンは正しいです。ただし、これはSQL Serverへの接続を開いたり閉じたりしないので、実際にはメモリ使用量やCPUに対する懸念には対応していません。

クライアントPC上のどのオープンおよびクローズがリースであり、ADO接続プールへの接続を返しますか。これは、ADO接続を閉じることが保証されていないことを意味し、ほとんどの場合、SQL Serverへの接続を閉じて解放しません。これは、接続の確立と認証が比較的高価で遅いためです。そのため、ADO接続プールは、接続を再確立したい場合に備えて、接続をプールに保持したままにします。

SQL Serverとの違いは、実行する必要がある同時クエリの数と、クエリのデータセットサイズ、およびデータベース内のデータの合計サイズです。

並行クエリはCPUを圧迫し、返されたデータセットは利用可能なRAMを圧縮します。明らかに、データベースが大きくなればなるほど、RAMにキャッシュすることが少なくなるため、クエリを実行するときにキャッシュ・ヒットする可能性は低くなります。

実際にSQL Expressエディションでの私の経験は、非常に具体的なことをしない限り、SQL Serverのフルエディションとの違いに気づかないことです。

1)ユーザーがユーザー定義またはユーザースコープのクエリを作成できるBIスタイルツールを作成します。 2)ひどいSQLを書く - 「大きなSQL」はあなたの悪いクエリの構文を隠すかもしれませんが、Expressは遊ぶRAMが少ないのでExpressは使えません。

効率的で制約の厳しいSQLを書くと、実際にはSQL Expressの制限に遭遇することはほとんどありません。

+0

ご返信ありがとうございます。私は連続して実行されている最大10のクエリを持っています。私は数ヶ月からパフォーマンスの問題を感じています。私はいくつかのデッドロックがあると思う。私がサーバーを再起動しているときには、すべてが正常になります。では、これは「Expressバージョン制限」の問題だと思いますか?私はそれを 'Standard Version'にアップグレードすべきですか?何かの抜け穴のために私のC#を再チェックすべきですか? –

+0

10個の同時クエリ、またはループ内で実行している10個のクエリがありますか?ループ内で実行されている10個のクエリの場合、SQL Expressは問題ではありません。無限に実行される10の同時クエリがあっても、SQL Expressには問題はありません。 サーバーをリブートしても差はありません。サーバーで何が行われているかを確認するには、通常のもの(Windowsパフォーマンスモニタ、SQL Serverプロファイラ)をすべて試してください。 – PhillipH

5

ちょうどusingを使用しています。

using(SqlConnection conn = new SqlConnection("Connection string")){ 
    //do sql stuff 
    conn.Open(); 
    //etc etc 
    conn.Close(); 
} 
+0

おかげであなたのような提案を –

+1

注: 'conn.Close();'は、接続を破棄するときに自動的に接続を閉じるようにオプションです( – FakeCaleb

2

あなたは適切に閉じられて配置されているすべてのものを確実にするために使い捨てのパターンを利用することをお勧めします:

var query = "select * from ValidId where [email protected]"; 

using (var conn = new System.Data.SqlClient.SqlConnection(usingConnectionString)) 
using (var command = new System.Data.SqlClient.SqlCommand(query, conn)) 
{ 
    command.Parameters.Add("@id", SqlDbType.Int).Value = Id; 
    conn.Open; 

    using (var reader = command.ExecuteReader()) 
    { 
     while (reader.Read()) 
     { 
      string Test = reader["Id"].ToString(); 
     } 
    } 

    command.Parameters.Clear(); 
} 

あなたは接続状態をチェックする必要はありません。それが処分されると閉じます。

注記:パラメータデータ型を明示的に指定することをお勧めします。私はあなたのケースではSqlDbType.Intと仮定しましたが、実際に何にでも変更することができます。

注意すべきもう1つの点は、ループ中に読者があまりにも多くしたくないということです。あなたはあなたのコレクションなどを作り、そこから出たいと思っています。あなたの接続が開いている方が短いほど良いでしょう。これは、他のユーザーやそのアプリケーションに影響を与える可能性のあるデータベースの行の一部に読み取りロックを保持している可能性があるためです。

+1

)。データアダプタでFill()メソッドを使用しない限り、手動で開く必要があります。あなたの例では何を使っていますか?未使用のようですか? –

+1

@ DanDef - そうですね、この質問のデータリーダーにデータアダプターを使用するスニペットを採用しました。私の悪い。私はExecuteReaderが接続を開いていないことを知っていた。 –

+0

@ rory.apはパフォーマンスにステートメントを使用することの効果はありますか?私はStatementを使ってアプリケーションをより速くすることができますか? –

関連する問題