c# - 如何从数据库中填充组合框项而不是在各处复制相同的代码(如何更改我的代码以使用 OOP)?

标签 c# sql oop design-patterns architecture

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();
        }
    }

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

最佳答案

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

首先,您希望通过复制粘贴将您的连接字符串散布到应用程序的任何地方。您应该创建一个专门的类来处理这个问题。

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);
}

如果到目前为止您都同意我的观点,只需向存储库模式 再迈出一步。添加这个类:

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),您会发现许多关于如何创建可以重用而不是重复代码的类的好主意。

注意:我还没有完成将事物拆分为接口(interface)的整个练习,这样您就可以轻松地进行单元测试和依赖注入(inject),这是一个更大的话题,但值得检查也出来了!

关于c# - 如何从数据库中填充组合框项而不是在各处复制相同的代码(如何更改我的代码以使用 OOP)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10364247/

相关文章:

java - 方法调用同一个类中的其他方法: bad design?

java - 继承不适用于作为泛型类型传递

c#线程访问问题

SQL统计按年龄曝光的life time

Java无法重写构造函数中使用的方法: The method setupAnimationFrames() of type Slime must override or implement a supertype method

sql - 采访: How to handle SQL NOT NULL constraint on the code end

SQLite - 具有联合的多个随机结果集

c# - Bing map 如何在 map (url) 上设置图钉?

c# - 获取 QuickFix/n 的 session 属性(用户名和密码)

c# - 如何从 Asp.Net Core 中的 DBContext 文件中的 appsettings.json 读取连接字符串?