如何在N层应用程序上处理SqlDatareader?

时间:2010-07-16 02:38:50

标签: c#

我很困惑在哪里可以将我的代码转换为n层: 在学习n层时,我现在知道如何插入,删除,更新。 但现在我很困惑如何处理sqldatareader绑定列表框和组合框上的数据:

此代码适用于我的表示层,但不知道如何将其转换为DataAccess,BusinessObject,BusinessLogic等层。

FormLoad
{
getlistview();
cboStatus();
}

#region "fill listview"
public void GetlistView()
{
        int i = 0;

        SqlConnection sqlcon = new SqlConnection(connStr);
       lstBF.Items.Clear();
        SqlCommand sqlcom = new SqlCommand("sp_LoadNew", sqlcon);
        SqlDataReader dr;
        lstBF.Items.Clear();
        sqlcon.Open();
        dr = sqlcom.ExecuteReader();

        while (dr.Read())
        {
            lstBF.Items.Add(dr["SerialNumber"].ToString());
            lstBF.Items[i].SubItems.Add(dr["PartNumber"].ToString());
            lstBF.Items[i].SubItems.Add(dr["StatusDescription"].ToString());
            lstBF.Items[i].SubItems.Add(dr["CustomerName"].ToString());
            lstBF.Items[i].SubItems.Add(dr["DateCreated"].ToString());
            lstBF.Items[i].SubItems.Add(dr["CreatedBy"].ToString());
            lstBF.Items[i].SubItems.Add(dr["ModifiedBy"].ToString());

            i = i + 1;
        }

        if (sqlcon.State == ConnectionState.Open) sqlcon.Close();
    }
    #endregion

    #region "ListviewChange"
    private void lstBF_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (lstBF.SelectedItems.Count == 1)
        {
          txtSerialNumber.Text = lstBF.SelectedItems[0].Text;
           txtPartNumber.Text  = lstBF.SelectedItems[0].SubItems[1].Text;
           lblStatus.Text  = lstBF.SelectedItems[0].SubItems[2].Text;
          lblcustomer.Text = lstBF.SelectedItems[0].SubItems[3].Text;
         lblModifiedBy.Text  = lstBF.SelectedItems[0].SubItems[6].Text;
        }
    }
    #endregion

    #region "FILL combo"
    public void cboStatus()
    {
        try
        {
          SqlConnection conn = new SqlConnection(connStr);
            SqlCommand sqlcom = new SqlCommand("sp_loadStatus",conn);
            SqlDataReader dr = null;
            conn.Open();
            dr = sqlcom.ExecuteReader();
            cmbStatus.Items.Clear();

            while (dr.Read())
            {
                 cmbStatus.Items.Add((dr["StatusDescription"]));
            }

            if (conn.State == ConnectionState.Open) conn.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error Occurred:" + ex);
        }
        finally
        {
        }
    }
    #endregion

2 个答案:

答案 0 :(得分:1)

如果你想要一个漂亮,干净的分离,这就是你应该做的:

  • 永远不会从数据层传递类似SqlDataReader或任何其他依赖数据库的对象 - 封装数据层中的所有内容,并从那里开始使用您自己的域模型(类)

  • 数据层应将您的数据库请求转换为域模型的对象。你绝对可以手工完成 - 但是很多无聊和容易出错的代码来做所有DataReader,读取每一行,转换为对象类的东西 - 这里,一个名为OR映射器的工具(对象 - 关系映射器)可以提供极大的帮助,因为它可以为您完成所有这些 - 或多或少是免费的。查看SubSonicLinq-to-SQL以及更多内容。

  • 对于像组合框查找列表这样的东西,你通常会设计一个“视图模型”,例如:用于“视图”(或webform或winform)的类,它将保存此视图应该显示的数据,以及b)其作业的需求。通常情况下,这种“视图模型”只是另一个类 - 没有任何魔力。它将包含一个或多个域模型类(您要显示的实际数据),以及包含所有下拉列表等可能值的一个或多个查找列表。

通过这种方法,您应该很好并且能够很好地实现良好的设计,并且通过使用ORM,您可以节省大量无聊的代码并专注于应用程序中更有趣的部分。

<强>更新
用于绑定组合框的示例:

  • 为查找值创建一个类,通常类似于:

    public class StatusCode
    {
         public int ID { get; set; } 
         public string Description { get; set; }
    }
    
  • 您的数据层中有一个方法可以将StatusCode表中的所有值检索到List<StatusCode>

    public List<StatusCode> GetAllStatusCodes();
    
  • 将UI中的组合框绑定到该列表:

    cbxStatusCode.DataSource = statusCodeList;
    cbxStatusCode.DisplayMember = "Description";
    cbxStatusCode.ValueMember = "ID";
    

    注意:根据您使用的是Winforms还是ASP.NET webforms,这略有不同。

你有它!

答案 1 :(得分:0)

您可以开始使用实体框架或像Subsonic这样的类生成器。

观看此播客,仔细阅读并查看为您创建的代码:

http://www.techscreencast.com/language/dotnet/subsonic-getting-started-webcast/227