0

请记住,我是 C# 和 OOP 的新手,所以如果这对某些人来说似乎是一个简单的问题,我提前道歉。我将回顾我的代码并寻找方法来客观化重复代码并为其创建一个类,以便我可以简单地重用该类。话虽如此,我还不想学习 NHibernate 或任何其他 ORM。我什至不想学习 LINQ。我想破解这个来学习。

基本上,我使用相同的代码来访问我的数据库并用我得到的值填充一个下拉列表。一个例子:

   protected void LoadSchools()
    {
        SqlDataReader reader;

        var connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
        var conn = new SqlConnection(connectionString);
        var comm = new SqlCommand("SELECT * FROM [Schools] ORDER BY [SchoolName] ASC", conn);

        try
        {
            conn.Open();
            reader = comm.ExecuteReader();
            cmbEditSchool.DataSource = reader;
            cmbEditSchool.DataBind();


            cmbEditSchool.Text = "Please select an existing school to edit...";
            if (reader != null) reader.Close();
        }

        finally
        {
            conn.Dispose();
        }
    }

我在整个程序中,在不同的页面上一遍又一遍地使用同样的代码。大多数情况下,我填充一个下拉列表或组合框,但有时我会填充一个网格视图,只是稍微改变查询。

我的问题是如何创建一个允许我调用存储过程的类,而不是像我的示例那样手动使用查询并填充我的不同控件?是否可以只使用一种方法?我只需要从选择开始。我一直在阅读 IEnumerable ,这似乎是合适的接口,但我该如何使用它呢?

编辑添加:

我将 Rorschach 的答案标记为 THE answer,因为他/她解决了我的 IEnumerable 问题。我也理解需要适当的 DAL 和 BLL 层。我试图达到的就是那个。我可以使用数据集和表适配器构建 DAL,最终得到一个强类型数据集。但是,我觉得有点脱离了代码。从我上面给出的代码开始,我一直在寻找一种直接构建 DAL 的方法。也许我没有正确地措辞我的问题或我所追求的。

无论如何,罗夏最接近回答我的实际问题。谢谢。

4

3 回答 3

2

这是一种减少代码重复的肮脏方法。设置数据访问层 (DAL) 和业务逻辑层 (BLL) 并不是真正正确的方法,我建议您学习一下。

protected void FillFromDatabase( string sql, BaseDataBoundControl dataControl)
{
SqlDataReader reader = null;

var connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
var conn = new SqlConnection( connectionString );
var comm = new SqlCommand( sql, conn );

try
{
    conn.Open();
    reader = comm.ExecuteReader();
    dataControl.DataSource = reader;
    dataControl.DataBind();
}

finally
{
    if( reader != null )
        reader.Dispose();

    conn.Dispose();
}
}

那么你可以这样称呼它

const string sql = "SELECT * FROM [Schools] ORDER BY [SchoolName] ASC";
FillFromDatabase( sql, cmbEditSchool );
于 2009-02-10T18:51:06.080 回答
2

您可以创建一个允许您调用存储过程的类(这称为数据访问组件 (DAC) 类,通常由业务组件 (BC) 类引用,但它超出了您的问题范围)。

您将希望在这个新类中使用一些对象: Microsoft.Practices.EnterpriseLibrary.Data.Database Microsoft.EnterpriseLibrary.Data.DatabaseFactory System.Data.Common.DBCommand

DAC 类看起来与您所拥有的类似:

public class DataAccess
{
    public DataAccess()
    {
    }
    public System.Collections.IEnumerable GetSchoolData()
    {
        string connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
        Database db = DatabaseFactory.CreateDatabase(connectionString);
        string sqlCommand = "GetSchoolData";
        DbCommand comm = db.GetStoredProcCommand(sqlCommand);
        //db.AddInParameter(comm, "SchoolId", DbType.Int32); // this is in case you want to add parameters to your stored procedure

        return db.ExecuteDataSet(comm);
    }
}

您的页面代码将如下所示:

public class SchoolPage : Page
{
  public void Page_Init(object sender, EventArgs e)
  {
    DataAccess dac = new  DataAccess();
    cmbEditSchool.DataSource = dac.GetSchoolData();
    cmbEditSchool.DataBind();
  }
}

请注意,这只是为了帮助您了解如何执行此操作。这不是一个好的开发方法,因为您正在向外部世界开放数据访问层(这很糟糕)。

于 2009-02-10T19:06:44.577 回答
0

您应该看看 ADO.NET 并使用 DataSets 之类的东西。Linq-to-SQL 也可能对您有用。但恐怕你不会只用一个方法调用来替换你所有的数据操作。

于 2009-02-10T18:48:24.650 回答