3
SqlDataReader myreader = null;
    SqlConnection sqlConn = null;

     cmbCat.Items.Clear();
    sqlConn = new SqlConnection("Data Source=tin;Initial Catalog=sample;Trusted_Connection=yes;");
    sqlConn.Open();
    SqlCommand sqlComm = new SqlCommand("SELECT members FROM  dbo.tbl_Category", sqlConn);

    myreader = sqlComm.ExecuteReader();
    if (myreader != null)
    {
        while (myreader.Read())
        {

            cmbCat.Items.Add(myreader["members"]);

        }
    }

    {
        if (myreader != null)
            myreader.Close();
        if (sqlConn != null)
        {
            if (sqlConn.State == ConnectionState.Open)
                sqlConn.Close();
        }
    }

我在将数据从数据库中检索到组合框中时使用了以下代码。每次我需要将数据从数据库填充到组合框中时,我总是放置此代码。我想要做的是重建这段代码并将它放在一个类中,我要做的就是调用负责将数据填充到组合框中的函数。但我对如何做到这一点感到困惑。请帮我。提前谢谢你。祝你有美好的一天..

4

2 回答 2

4

您发布的代码中有几个问题。我将尝试提供一组简化的代码,但是如果您将这部分代码的各种需求(关注点)分开,您会发现许多不同的类,但我离题了。

首先,您希望使用 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);
}

如果您研究以下主题:泛型、存储库模式和数据传输对象 (DTO),您会发现许多关于如何创建可以重用而不是复制代码的类的好主意。

注意:我还没有完成将事物拆分为接口的整个练习,以便您可以轻松进行单元测试和依赖注入,这是一个更大的主题,但也是一件好事!

于 2012-04-28T14:38:02.590 回答
2

通常,您希望将表示逻辑与业务/数据访问逻辑分开。因此,您的数据访问代码应该以通用形式返回数据,例如某个DataTable或某种自定义集合。然后您在表单上的调用代码将负责将其填充到组合框中:

public List<string> GetCategories()
{
    List<string> cats = new List<string>();
    SqlDataReader myreader = null;
    ...
    while (myreader.Read())
        cats.Add((string)myreader["members"]);
    ...
    return cats;
}

然后在你的表单中,你会做这样的事情:

protected void DoDataBinding()
{
    MyDataAccessClass dataAccess = new MyDataAccessClass();
    List<string> cats = dataAccess.GetCategories();
    cmb.Items.Clear();
    foreach (string cat in cats)
        cmb.Items.Add(cat);
}
于 2012-04-28T14:16:10.540 回答