2011-11-15 8 views
0

私は自分のコードをシンプルに保ち、再利用できるようにトリミングするのが大好きです。さまざまな種類のオブジェクトにデータリーダーを使用しているのと苦労しているところで、メソッドでそれを見つけて見つけました接続が閉じているか開いている状態での問題でした。だから私は強制的に、コードをコピーして貼り付けることになります。これは私が嫌いなものです! 私はこれをスケールダウンしてメソッドに入れ、再利用可能でいいものにする方法はありますか?C#:コードを短縮してストアドプロシージャを実行するにはどうすればよいですか?

ENT_AuctionBid ret = new ENT_AuctionBid();  

try 
     { 
      SqlParameter[] Params = new SqlParameter[]{ 
        new SqlParameter("@ID", ID) 
      }; 

      using (SqlConnection conn = new SqlConnection(this.ConnectionString)) 
      { 
       using (SqlCommand command = new SqlCommand("GetItem", conn)) 
       { 
        SqlDataReader reader; 
        command.CommandType = CommandType.StoredProcedure; 

        conn.Open(); 

        command.Parameters.AddRange(Params); 
        reader = command.ExecuteReader(CommandBehavior.SingleRow); 

        while (reader.HasRows) 
        { 
         while (reader.Read()) 
         { 
      // 
          ret = this.Convert(reader); 
         } 

         reader.NextResult(); 
        } 

        reader.Close(); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 

     } 
return ret; 

答えて

1

あなたはSqlDataAdapterオブジェクトを使用する必要があります。ここで
がそれを使用する方法の良い例です: http://www.dotnetperls.com/sqldataadapter

また、あなたは、Entity Frameworkのへの切り替えを検討する必要があります、それは、あなたのデータアクセスがはるかに簡単になりますが、既存のプロジェクトに複雑になるかもしれません。

+0

SqlDataAdapterにはかなりのオーバーヘッドがあります。これは実際には必要ありません。だから私はそれに反対します。 EFがオプションである可能性があります –

+0

私はエンティティフレームワークに切り替えました.Fantastic! – Funky

0

あなたは、LINQからSQLへ、それはあなたがちょうど& -dropデータベースのテーブルとストアドプロシージャをdrag-する独自のDataClassシステムのしている使用して開始することができます。次に、クラスの上部にインスタンスを作成するだけです。private MyCustomDataClass _db = new MyCustomDataClass();と入力してから_db.<Here all datatables and SPROCs will appaer for you to choose>と入力します。

例(すべてのストアドプロシージャをのDataClassに追加されたときから)

private MyCustomDataClass _db = new MyCustomDataClass(); 

public void MethodToRunSPROC(string email, Guid userId) 
{ 
    _db.MySPORC_AddEmailToUser(email, userId); 
} 
0

これは少し小さいです: -

try 
     { 

      using (SqlConnection conn = new SqlConnection(this.ConnectionString)) 
      { 
       using (SqlCommand command = new SqlCommand("GetItem", conn)) 
       { 
        command.Paramaters.AddWithValue("@ID",ID); 
        command.CommandType = CommandType.StoredProcedure; 

        conn.Open(); 

        reader = command.ExecuteReader(); 

        while (reader.Read()) 
        { 

      // 
          ret = this.Convert(reader); 

        } 

       } 
      } 
     } 
     catch (Exception ex) 
     { 

     } 
0

タイプSqlCommandのオブジェクトを作成して返すヘルパーメソッドを作成します。接続オブジェクトをこのヘルパーメソッドに渡すとともに、ストアドプロシージャ名とパラメータリスト(存在する場合)を渡します。データ・リーダーから作成された異なるオブジェクトがある場合は、データ・リーダーをコンストラクターに渡し、そのデータに基づいてオブジェクトを生成させます。 接続を閉じるためには、常にtry ... catch ...を実行してください。最後のセクションで接続を閉じます。

+0

を使用すると、接続を終了するdisposeが呼び出されます。 –

+0

真。 @Funkyはコネクションに問題があったと言いました。個人的には、私は通常バックグラウンドで特定のロギングを行う必要があるため、私の接続もヘルパーメソッドで作成されるため、using()の代わりにtry..catch..finallyを使用します。次に、接続が閉じられてfinallyブロックに置かれる前に、いくつかのチェックを行うclose connection helperメソッドがあります。 –

0

私のプロジェクトでは、通常この問題を解決して、DBにアクセスし、db接続とアダプタに関連するすべてのものを管理するすべてのメソッドを含むユーティリティクラスを作成します。 例えば接続(SqlConnectionオブジェクトの接続;)が含まれDBSQLというクラスプライベートメンバと、次の方法のように:私のクラスで

//execute the query passed to the function 
public System.Data.DataSet ExecuteQuery(string query) 
//returns if a query returns rows or not 
public bool HasRows(string query) 
//execute commands like update/insert/etc... 
public int ExcuteNonQuery(string sql) 

は、あなただけの文字列とクラスを渡すために、様々なデータアダプターとコマンドを初期化しますそれを実行してデータセットを返します。あなたはそれを複雑にして、パラメータ/トランザクションや他のすべてを管理することができます。 このようにして、接続とオブジェクトは常に同じ方法で処理され、うまくいけば正しい方法で処理されます。

1

あなたはそれがはるかに少ない行使用して行うことができます:すべての接続は、(使用してを使用しているため)、このコードを使用して閉鎖されている

// Skipped creating temp variable 
try { 
    using (SqlConnection conn = new SqlConnection(this.ConnectionString)) 
    using (SqlCommand command = new SqlCommand("GetItem", conn) { CommandType = CommandType.StoredProcedure}) { 

     command.Parameters.AddWithValue(@ID, ID); 
     conn.Open(); 

     // reader is IDisposable, you can use using 
     using (var reader = command.ExecuteReader(CommandBehavior.SingleRow)) { 
      // Skipped parsing multiple result sets, you return after the first 
      // otherwise there's no point using SingleRow 
      // If nothing is read, return default value 
      return reader.Read() ? this.Convert(reader) : new ENT_AuctionBid(); 
     } 
    } 
} 
catch (Exception ex) { 
    // Handle your exception here 
} 
// Return default value for error 
return new ENT_AuctionBid(); 

を。あなたは単一行しか期待しないので、不要なループは作成されません。一時変数は不要なので、abondendオブジェクトは作成されず、使用時にのみ作成されます。

0

MicrosoftデータアクセスアプリケーションブロックのSqlHelper.csなどのユーティリティファイルを使用できます。あなたが必要とするコードはすべてこれです。

using (SqlDataReader sdr = SqlHelper.ExecuteReader(this.ConnectionString, "GetItem", ID)) 
    { 
    while (sdr.Read()) 
    { 
     ret = this .Convert(sdr); 
    } 
    } 
関連する問題