投稿したコードにはいくつかの懸念があります。簡略化されたコード セットを提供しようとしますが、この小さなコードのさまざまなニーズ (懸念事項) を分離すると、多くの異なるクラスが見つかりますが、余談になります。
まず、COPY-PASTE を使用してアプリケーション内のあらゆる場所に接続文字列を広げたくありません。これを処理する専用のクラスを作成する必要があります。
public class DatabaseGateway
{
public IList<T> RetrieveSqlAs<T>(string queryString, ITransformer<SqlDataReader, T> rowTransformer)
{
var result = new List<T>();
using (var sqlConn = new SqlConnection(connectionString)) // you can use a CONSTANT, or call to a .config file here
using (var sqlCommand = new SqlCommand(queryString, sqlConn))
{
var myreader = sqlComm.ExecuteReader();
while (myreader.Read())
{
result.Add(rowTransformer.Transform(myreader));
}
}
return result;
}
}
public class MemberRowTransformer : ITransformer<SqlDataReader, string>
{
public string Transform(SqlDataReader from)
{
from["members"]; // handle null and anything else here
}
}
public interface ITransformer<TFrom, TTo>
{
TTo Transform(TFrom)
}
次に、次のように使用します。
var gateway = new DatabaseGateway();
var transformer = new MemberRowTransformer();
cmb.Items.Clear();
foreach (string i in gateway.RetrieveSqlAs("SELECT members FROM dbo.tbl_Category", transformer))
{
cmb.Items.Add(i);
}
これまで私と一緒だったなら、もう一歩進んでRepository Pattern
ください。このクラスを追加します。
public class MembershipRepository
{
public List<string> GetMembers()
{
var gateway = new DatabaseGateway();
var transformer = new MemberRowTransformer();
var result = new List<string>();
foreach (string i in gateway.RetrieveSqlAs("SELECT members FROM dbo.tbl_Category", transformer))
{
result.Add(i);
}
return result;
}
}
次に、呼び出しコードは次のようになります。
var repository = new MembershipRepository();
cmb.Items.Clear();
foreach(string i in repository.GetMembers())
{
cmb.Items.Add(i);
}
Generics、Repository Pattern、および Data Transfer Objects (DTO) のトピックを調べると、コードを複製する代わりに再利用できるクラスを作成する方法について、多くの優れたアイデアが見つかります。
注:簡単に単体テストと依存性注入を実行できるように、インターフェイスに分割するという全体的な演習は行っていません。これはより大きなトピックですが、同様に確認することをお勧めします。