2011-01-04 9 views
3

私は多くのストアドプロシージャを持っています。ストアドプロシージャの使用方法は?

public class DBHandler 
{ 
    private static Database db = DatabaseFactory.CreateDatabase("db"); 

    public static DataTable GetItems(long filterId) 
    { 
     DbCommand command = db.GetStoredProcCommand("dbo.P_GetItems"); 
     db.AddInParameter(command, "@filter_id", DbType.Int64, filterId); 
     IDataReader reader = db.ExecuteReader(command); 
     DataTable dt= new DataTable(); 
     dt.Load(reader, LoadOption.OverwriteChanges); 
     reader.Close(); 
     return dt; 
    } 
    . 
    . 
    . 
    . 
} 

私が書いたように、私は多くのストアドプロシージャを持っていると、このコードは迷惑です繰り返します は、それらを使用するためには、私は、このような静的メソッドと静的クラスを作成します。 ストアドプロシージャを呼び出す方法はありますか?

答えて

1

単純なLINQクエリで使用できるデータコンテキストコードを自動生成するには、コマンドラインユーティリティsqlmetal.exeを使用できます。

1

さまざまなDALを調べます。私たちは、接続、コマンド、および読者オブジェクトのためのIDisposable requriementsを包括するのに役立つ自家製ソリューションを持っています。引数の受け渡しと変換も簡単になります。しかし、ロケット手術ではありません - 私はそこに多くのオプションがあると確信しています。

0

私はこのようなものが好き:

public static IEnumerable<IDataRecord> SqlRetrieve(string ConnectionString, string StoredProcName, Action<SqlCommand> addParameters) 
    { 
     using (SqlConnection cn = new SqlConnection(ConnectionString)) 
     using (SqlCommand cmd = new SqlCommand(StoredProcName, cn)) 
     { 
      cn.Open(); 
      cmd.CommandType = System.Data.CommandType.StoredProcedure; 

      if (addParameters != null) 
      { 
       addParameters(cmd); 
      } 

      using (SqlDataReader rdr = cmd.ExecuteReader()) 
      { 
       while (rdr.Read()) 
        yield return rdr; 
      } 
     } 
    } 

あなたがここに何を得るには、パラメータを提供するために、デリゲートを取り、再利用可能な列挙子(あなたがテーブルを返すために、これを変更することができます)です。

foreach (var dr in 
     SqlRetrieve(cn, sp, 
        delegate (SqlCommand cmd) { 
         cmd.Parameters.Add("@paramname", System.Data.SqlDbType.Int).Value = someint; 
        } 
     ) 
) { 
} 

ですから、すべて同じコードを繰り返していないだけで、パラメータの部品:実際の使用状況で

が、それは次のようになります。あなたのケースでは、DataReaderループで多くのコードを取得する必要がなく、DataTableを返すのであれば、コードはさらに簡単になります。

関連する問題