如何从SQL数据库填充C#中的通用对象列表

w41d8nur  于 2022-10-22  发布在  C#
关注(0)|答案(3)|浏览(204)

我只是在学习ASP.NET c#,并尝试将最佳实践融入到我的应用程序中。我读到的所有内容都是基于关注点的分离将我的应用程序分层为DAL、BLL、UI等。我正在考虑使用自定义对象,而不是传递数据表,这样我可以松散地耦合到数据层,并可以利用VS中的智能感知。我想这些对象会被视为DTO吗?
首先,这些对象位于我的层中的何处?BLL,DAL,其他?
第二,当从SQL填充时,我应该循环通过数据读取器来填充列表,还是先填充数据表,然后循环通过表来填充列表?我知道您应该尽快关闭数据库连接,但填充数据表,然后循环遍历列表似乎会增加更多开销。
第三,我最近看到的所有内容都使用Linq2SQL。我计划学习Linq2SQL,但此时我正在使用一个没有外键设置的旧数据库,而且我没有能力在atm上修复它。此外,在开始使用nHibernate等ORM解决方案之前,我想了解更多关于c#的信息。同时,我不想为每个查询键入所有连接和SQL管道。现在可以使用企业DAAB吗?

y0u0uwnf

y0u0uwnf1#

你在一个问题中有很多问题。
Linq2SQL只是一种ORM,如果你想走这条路,我会看看实体框架(微软的ORM)。
让我们稍微谈谈分层应用程序,以帮助您了解如何填充对象。典型的数据库应用程序由3层组成(有人说4层,并将数据库本身称为一层,这真的无关紧要)。您有以下内容:

  • 用户界面
  • BLL公司
  • 达尔

所以你的沟通是UI与BLL对话,BLL与DAL对话。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;
                    }
                }
            }
}

其中一些是摘自道夫工厂网站。学习如何使用设计模式的绝佳资源。无论如何,这只是一个.class文件。现在您需要另一个对象,比如CustomerDAO(客户数据访问对象)。
好的,那么你如何使用你创建的DB类(好吧,我将使用sproc的组合,但为了使这成为一个简单的帖子,让我们暂时避免存储过程)。如果我需要获得客户,我可以定义如下:

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类本身在哪里呢?它可以在另一个文件夹中作为业务层,因为它只是一个业务对象。在这里,您可以在customer类中设置验证和必填字段。
您的UI根本没有任何与数据读取器、数据集或SQL相关的内容。业务层也与此无关(它定义了业务对象背后的一些规则)。您的dal可以非常灵活(可以与SQL、Oracle等配合使用),如果您计划这样做,也可以限制为使用SQLServer。不要过度使用你的应用程序。如果你是一个微软人,并且肯定只使用SQLServer,那么不要试图推出与任何供应商都能使用的最终DAL,从而使你的工作变得困难。可以使用SQLCommand、SQLConnection等。

u4dcyp6a

u4dcyp6a2#

去看看Telerik的OpenAccess ORM。您不必将其用作“ORM”,但它将使您能够快速为表生成类,而无需全部键入。然后,您可以在DAL中使用这些强类型类,无论它是自定义编写的还是基于ORM的其他东西。在这种情况下,您只是使用它来生成代码,以便快速入门(这些对象非常基本和简单,即,如果您要手工编写它们,您将从何处开始)。
至于从其他对象中抽象DAL对象,请查看WCF。你可以把它放在每一层(UI/Biz/DAL)之间,它将生成代理对象来处理你的关注点分离。

3ks5zfa0

3ks5zfa03#

如果您使用的是VisualStudio,则很容易链接这些项目。你所要做的就是通过引用链接项目。转到参考,并浏览项目。例如,要将DAL项目链接到BL项目,请转到BL参考并搜索项目DAL。
要创建从SQL表中选择列的方法,可以转到https://www.csharpporgramming.com/sqltocsen.aspx

相关问题