首先,这些对象在我的图层中的位置? BLL,DAL,其他?
其次,当从sql填充时,我应该循环通过数据读取器来填充列表还是首先填充数据表,然后循环遍历表以填充列表?我知道你应该尽快关闭数据库连接,但是填充数据表然后循环遍历列表似乎需要更多的开销.
第三,我现在看到的一切都说使用Linq2sql.我打算学习Linq2sql,但此时我正在使用没有外键设置的遗留数据库,我没有能力修复它.另外,在开始进入像nHibernate这样的ORM解决方案之前,我想了解更多关于c#的知识.同时我不想为每个查询键入所有连接和sql管道.现在可以使用Enterprise DAAB吗?
解决方法
Linq2sql只是一种ORM类型,如果你要走那条路,我会看一下实体框架(microsoft的orm).
让我们来谈谈分层应用程序,以帮助您了解如何填充对象.
您的典型数据库应用程序由3个层组成(有些人说4个并且将数据库本身称为一个层,它确实无关紧要).你有以下几点:
> UI
> BLL
> DAL
所以你的沟通是与BLL和BLL与DAL谈话的UI谈话. DAL将一些数据返回给BLL,BLL又将其呈现给UI.我不知道是谁告诉你数据集/表格不好…确保读者速度更快但并不意味着使用数据表是不好的.
让我给你举个例子.不要把你的DAL想象成一个简单的类.开始将DAL层视为不同类的整个文件夹.其中一个类是静态DB类.它是静态的,因为您正在处理一个数据库(在大多数情况下),因此无需实例化该类.所以它可能看起来像这样:
public static class DB { private static readonly string connectionString = ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString; private static readonly DbProviderFactory factory = DbProviderFactories.GetFactory(dataProvider); public static int Update(string sql) { using (DbConnection connection = factory.CreateConnection()) { connection.ConnectionString = connectionString; using (DbCommand command = factory.CreateCommand()) { command.Connection = connection; command.CommandText = sql; connection.Open(); return command.ExecuteNonQuery(); } } } public static DataTable GetDataTable(string sql) { using (DbConnection connection = factory.CreateConnection()) { connection.ConnectionString = connectionString; using (DbCommand command = factory.CreateCommand()) { command.Connection = connection; command.CommandType = CommandType.Text; command.CommandText = sql; using (DbDataAdapter adapter = factory.CreateDataAdapter()) { adapter.SelectCommand = command; DataTable dt = new DataTable(); adapter.Fill(dt); return dt; } } } }
其中一些来自dofactory网站.学习如何使用设计模式的重要资源.无论如何这只是一个.class文件.现在您需要另一个说CustomerDAO(客户数据访问对象).
好的,你怎么能使用你创建的那个数据库类(好吧我会使用sprocs的组合但是为了使这个简单的帖子让我们现在避免使用存储过程).如果我需要获得客户,我可以定义:
public IList<Customer> GetCustomers() { StringBuilder sql = new StringBuilder(); sql.Append(" SELECT CustomerId,CompanyName,City,Country "); sql.Append(" FROM Customer "); DataTable dt = Db.GetDataTable(sql.ToString()); return MakeCustomers(dt); }
请记住,这是一个完全不同的.class文件.那么如何让客户看起来:
private IList<Customer> MakeCustomers(DataTable dt) { IList<Customer> list = new List<Customer>(); foreach (DataRow row in dt.Rows) list.Add(MakeCustomer(row)); return list; }
所以我在这里做的是我有一个充满客户的数据表.我需要循环遍历数据表的每一行并使客户:
private Customer MakeCustomer(DataRow row) { int customerId = int.Parse(row["CustomerId"].ToString()); string company = row["CompanyName"].ToString(); string city = row["City"].ToString(); string country = row["Country"].ToString(); return new Customer(customerId,company,city,country); }
因此,该客户是新的并存储在客户列表中.
这只是您的数据访问层所做的一个小例子.数据库类只存储连接字符串和函数以获取数据集或获取数据表,甚至在您的情况下获取数据读取器(您也可以这样做). CustomerDAO类只是一个处理客户对象的类,可以实现一个ICustomer接口.
那么Customer类本身在哪里?它可以在另一个文件夹中作为业务层,因为它只是一个业务对象.您可以在此处设置客户类内的验证和必填字段.
您的UI根本没有与数据引用器,数据集或sql相关的任何内容.您的业务层也与它无关(它定义了业务对象背后的一些规则).您的dal可以非常灵活(可以使用sql,Oracle等),或者可以限制为说sql Server,如果这是您计划执行的操作.不要过度使用你的应用程序.如果您是MS人并且肯定只使用sql Server,那么尝试推出适用于任何供应商的最终DAL,不会让您的工作变得困难.可以使用sqlCommand,sqlConnection等.