我很困惑在哪里可以将我的代码转换为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
答案 0 :(得分:1)
如果你想要一个漂亮,干净的分离,这就是你应该做的:
永远不会从数据层传递类似SqlDataReader或任何其他依赖数据库的对象 - 封装数据层中的所有内容,并从那里开始使用您自己的域模型(类)
数据层应将您的数据库请求转换为域模型的对象。你绝对可以手工完成 - 但是很多无聊和容易出错的代码来做所有DataReader,读取每一行,转换为对象类的东西 - 这里,一个名为OR映射器的工具(对象 - 关系映射器)可以提供极大的帮助,因为它可以为您完成所有这些 - 或多或少是免费的。查看SubSonic,Linq-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