【问题标题】:C# object creation from datatable从数据表创建 C# 对象
【发布时间】:2011-02-01 20:02:06
【问题描述】:

我刚刚开始了解 C#。我一直在创建类和对象,所以说我创建了一个名为 Member 的类:

 public class Member
 {
     public int MemberID;
     public string FirstName;
     public string LastName;
     public string UserName;
 }

然后我通过这样做来创建该类的新对象:

    Member Billy = new Member();

    Billy.UserName = "Jonesy";
    Billy.FirstName = "Billy";
    Billy.LastName = "Jones";

这很好,但是如果我查询了一个数据库并取回了 5 个成员,我可以动态创建对象吗?或者将这些成员存储在内存中的最佳方式是什么?

我使用过 VB.Net,我只需将它们添加到数据表中。但是我以前从来没有真正做过任何面向对象的编程,我想自从我学习 C#以来,现在是学习 OOP 的最佳时机。

【问题讨论】:

  • C# 与 VB.Net 没有区别
  • 是的,但我确信 VB.Net 没有面向对象的 C# 面向对象会有很大不同!
  • VB.NET 绝对是面向对象的。你是说 VB6(“经典 VB”)吗?
  • 不抱歉,我的意思不仅是我要从 VB.NET 转到 C#,而且我以前从未学习过面向对象编程,我认为现在是学习的好时机。我已经开发 VB.NET 应用程序大约 11 个月了,但没有使用类等。

标签: c# class object datareader


【解决方案1】:

如果您不使用 LINQ to SQL(或实体框架),那么使用 a regular ADO.NET DataReader 您将遍历结果,使用详细信息实例化一个新对象,并将其添加到列表中。

大概是这样的:

List<Member> members = new List<Member>();
using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();

    using (SqlCommand command = new SqlCommand(queryString, connection))
    {
        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                Member member = new Member();
                member.UserName = reader.GetString(0);
                member.FirstName = reader.GetString(1);
                member.LastName = reader.GetString(2);
                members.Add(member);
            }
        }
    }
}

foreach(Member member in members)
{
    // do something
}

【讨论】:

  • 这就是我的想法!就最佳实践而言,花时间学习 LINQ to SQL 更好,还是我可以坚持使用好的旧 SQL?干杯
  • @Jonesy 这是在 LINQ to SQL 之前出现的,它是数据库交互的原始方法(也有类型化的数据集),并且最接近金属,但不会为您生成任何类。 LINQ to SQL / EF 是对象关系映射器 (ORM) 并为您生成类。所以这一切都取决于你想做什么。 LINQ to SQL 在后台使用了这些东西。最佳实践并不规定要使用的技术,而是如何使用每种技术。这意味着,在 ADO.NET、LINQ to SQL 等方面有最佳实践。
  • 是的,我想我宁愿自己定义类,然后以这种方式创建对象。干杯!
  • @Jonesy 我发布了这个信息来演示最基本的做事方式。当然,如果您有时间,一定要尝试其他选项。它们确实大大减少了开发时间,但您需要学习如何使用它们。 StackOverflow 使用 LINQ to SQL :) Entity Framework 是微软正在推动的新技术。
  • @Ahmad:-1 树立了一个坏榜样。 SqlCommandSqlDataReader 都需要在 using 块中。纠正这一点,我将删除反对票。
【解决方案2】:

这是一个常见问题。幸运的是,有一个很好的答案:Linq To Sql!你可以在这里阅读:http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx

它的基本作用是创建一个类,为您在数据库中选择的每个表创建一个类。这使得将所有对象直接从数据库中获取到面向对象编程中变得非常容易。

保存就像调用函数“SubmitChanges()”一样简单。这方面有更多的提供者,但我认为 Linq 非常适合初学者,因为它抽象了很多烦人的部分。

【讨论】:

    【解决方案3】:

    我建议您查看 LINQ to SQL。然后你可以编写这样的代码来查询数据库以获取特定用户:

    Member member = db.Members.Single(member => member.UserName == "Jonesy");
    

    或让用户符合条件:

    IQueryable<Member> members = db.Members
        .Where(member => member.LastName == "Jones");
    

    LINQ to SQL 还负责编写样板代码以根据数据库结构声明类。

    【讨论】:

      【解决方案4】:

      Linq2Sql 建议两次并不是唯一的方法,但考虑到所有对象都可以一对一映射到数据库中的表的情况,它工作得很好。但是,我个人会选择 EF,因为它允许您拥有更多的抽象层。

      我也可以建议你看看 db4o 等,你可以在那里节省你的 poco ,仅此而已。

      【讨论】:

      • @vittore:我建议您详细说明“多一层抽象”的含义。 知道你的意思是类不必与数据库是一对一的,但 OP 现在可能知道了。尤其如此,因为他收到了很多使用 LINQ to SQL 的建议。
      • @John Saunders:感谢您的建议,但是我的信息的重点是查看 db4o,因为在某些情况下它可能是非常简单的持久性实现。
      • @vittore:在这种情况下,我建议你从“我也可以建议”开始一个新的段落。
      • @John Saunders:实际上是这样,但是有一个 CR 不会开始新段落,现在不知道为什么,当我输入两次时 - 它有效
      • @vittore:当您提出问题并单击正文时,请参阅 stackoverflow.com/editing-help 或“如何格式化”框。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-14
      • 2021-03-08
      • 1970-01-01
      • 2021-01-25
      • 2020-07-10
      相关资源
      最近更新 更多