从数据表创建C#对象

5

我正在学习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,在其中只需将它们添加到datatable中即可。但我以前从未真正进行面向对象编程,而且我认为既然我正在学习C#,现在是学习OOP的最佳时机。


C#并不比VB.Net有太大的区别。 - Rowland Shaw
是的,但我确信VB.Net非面向对象的,转换成C#面向对象会有很大的区别! - iamjonesy
VB.NET绝对是面向对象的。您是指VB6(“经典VB”)吗? - Michael Petrotta
不好意思,我的意思不只是我从VB.NET转到C#,而且我以前从未学过面向对象的编程,现在觉得学习是个好时机。我已经开发了大约11个月的VB.NET应用程序,但没有使用类等。 - iamjonesy
4个回答

1
我建议您看一下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 还负责编写基于数据库结构声明类的样板代码。

1

如果您不使用LINQ to SQL(或实体框架),那么使用常规的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呢?谢谢。 - iamjonesy
1
@Jonesy 这个东西在 LINQ to SQL 之前就有了,它是与数据库交互的基本方法(还有类型化的数据集),最接近底层但不会为你生成任何类。LINQ to SQL / EF 是对象关系映射器(ORM),会为你生成类。所以这取决于你想做什么。LINQ to SQL 在幕后使用了这些东西。最佳实践并不规定要使用哪种技术,而是如何使用每种技术。也就是说,在 ADO.NET、LINQ to SQL 等方面都有最佳实践。 - Ahmad Mageed
是的,我想我宁愿自己定义类,然后以这种方式创建对象。干杯! - iamjonesy
@Jonesy 我发布了这些信息,以展示最基本的操作方式。当然,如果你有时间,一定要尝试其他选项。它们可以大大缩短开发时间,但你需要学习如何使用它们。StackOverflow 使用 LINQ to SQL :) Entity Framework 是微软正在推广的新技术。 - Ahmad Mageed
@Ahmad:给你扣一分是因为你树立了一个不好的榜样。SqlCommandSqlDataReader都需要在using块中使用。修改这个问题,我就撤销那个负评。 - John Saunders

1

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

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

保存只需要调用一个函数“SubmitChanges()”。虽然还有更多的提供程序,但我认为Linq会适合初学者,因为它抽象了许多烦人的部分。


0

Linq2Sql被建议两次并不是唯一的方式,但是在考虑到所有对象都可以一对一映射到数据库表时,它正常工作。然而,个人而言,我会选择EF,因为它允许您拥有更多的抽象层。

此外,我还可以建议您查看db4o等内容,那里您只需保存您的poco就行了。


@vittore:我建议你详细说明一下你所说的“再多一层抽象”的含义。我知道你意思是类无需与数据库一一对应,但提问者可能不知道。尤其是因为他一直在得到很多使用LINQ to SQL的建议,所以这一点尤为重要。 - John Saunders
@John Saunders:感谢您的建议,然而我留言的主要意图是让大家关注db4o,因为在某些情况下它可能是一种非常简单的持久化实现方式。 - vittore
@vittore:在这种情况下,我建议您从“Also I can suggest”开始新段落。 - John Saunders
@John Saunders:实际上是这样的,但是只有一个回车不会开始新段落,我不知道为什么,当我按两次回车时 - 它就可以了。 - vittore
1
@vittore:请查看http://stackoverflow.com/editing-help或者在提问时点击正文中的“How to format”框。 - John Saunders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接