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/