Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#从datatable创建对象_C#_Class_Object_Datareader - Fatal编程技术网

C#从datatable创建对象

C#从datatable创建对象,c#,class,object,datareader,C#,Class,Object,Datareader,我正忙得团团转。我一直在创建类和对象,所以我创建了一个名为Member的类: public class Member { public int MemberID; public string FirstName; public string LastName; public string UserName; } 通过这样做,我创建了该类的一个新对象: Member Billy = new Member(); Billy.UserN

我正忙得团团转。我一直在创建类和对象,所以我创建了一个名为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的最佳时机。

这是一个常见的问题。幸运的是,有一个很好的答案:LINQtoSQL!您可以在此处阅读:

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


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

我建议您看看Linq to SQL。然后,您可以编写如下代码来查询数据库以获取特定用户:

Member member = db.Members.Single(member => member.UserName == "Jonesy");
或让用户符合标准:

IQueryable<Member> members = db.Members
    .Where(member => member.LastName == "Jones");
IQueryable members=db.members
。其中(member=>member.LastName==“Jones”);

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

如果不使用LINQ to SQL(或实体框架),则使用将循环遍历结果,实例化具有详细信息的新对象,并将其添加到列表中

大致上是这样的:

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
}
列表成员=新列表();
使用(SqlConnection连接=新的SqlConnection(connectionString))
{
connection.Open();
使用(SqlCommand=newsqlcommand(queryString,connection))
{
使用(SqlDataReader=command.ExecuteReader())
{
while(reader.Read())
{
成员=新成员();
member.UserName=reader.GetString(0);
member.FirstName=reader.GetString(1);
member.LastName=reader.GetString(2);
成员。添加(成员);
}
}
}
}
foreach(成员中的成员)
{
//做点什么
}

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


另外,我可以建议你看看db4o等等,在那里你可以保存你的poco,仅此而已。

C#与VB.Netyeah没有什么不同,但是我确信VB.Net没有面向对象的与C#面向对象的会有很大的不同!VB.NET绝对是面向对象的。你是说VB6(“经典VB”)?不,对不起,我的意思不仅是我要从VB.NET转到C#,而且我以前从未学习过面向对象编程,现在认为是学习的好时机。我已经开发VB.NET应用程序大约11个月了,但没有使用类等。这就是我的想法!就最佳实践而言,花时间学习LINQtoSQL更好,还是我可以坚持使用好的老SQL?Cheers@Jonesy这是在LINQ转换为SQL之前出现的,它是数据库交互的普通方法(也有类型化数据集),最接近金属,但不为您生成任何类。LINQ到SQL/EF是对象关系映射器(ORM)并为您生成类。所以这完全取决于你想做什么。LinqtoSQL在幕后使用这些东西。最佳实践并不规定要使用哪种技术,而是规定如何使用每种技术。也就是说,ADO.NET、LINQ到SQL等都有最佳实践。是的,我想我宁愿自己定义类,然后用这种方式创建对象。干杯@Jonesy我发布了这些信息来演示最基本的做事方式。当然,如果你有时间,一定要考虑其他选择。它们确实大大缩短了开发时间,但您需要学习如何使用它们。StackOverflow使用LINQ to SQL:)实体框架是微软正在推动的新技术。@Ahmad:-1用于树立一个坏榜样。
SqlCommand
SqlDataReader
都需要使用
块。维托尔:我建议你详细说明你所说的“多一层抽象”是什么意思。我知道你的意思是这些类不必与数据库一一对应,但是OP现在可能知道了。尤其如此,因为他收到了很多关于使用LINQ to SQL的建议。@John Saunders:谢谢你的建议,不过我的信息的要点是看看db4o,因为在某些情况下它可能是非常简单的持久性实现。@vittore:在这种情况下,我建议你从“我也可以建议”开始写一段新的内容约翰·桑德斯:事实上是这样的,但是有一个CR并不能开始新的段落,现在为什么不呢?当我输入两次时——它works@vittore:当您提出问题并单击正文时,请参阅或“如何设置格式”框。