.NET中从DataReader转换为List

3

我有一个像这样的连接查询:

string cmdString = "select tblPackages.*, tblPackageTypes.Name from tblPackages join tblPackageTypes on tblPackages.TypeId = tblPackageTypes.Id";

现在我使用这个SQL命令,并获取一个像这样的数据读取器:
SqlCommand cmd = new SqlCommand(cmdString,con);
SqlDataReader dr;

我希望将数据读取器中的值填充到列表中。我参考了这个链接,但是并没有得到我需要的结果。
我从SQL中获得了以下列的输出:
Id, TypeId, AllowedSMS, TimeSpan, Price, TypeName. 

我只想在列表中传递它们,请帮忙。而且我是asp.net的新手。


1
"但我没有得到我所需要的东西" => 你尝试了什么,实际上得到了什么? - Koen
@Koen 这个列表是整数类型,但我需要所有列的列表。 - Robz
1
然后,您将需要创建一个类来保存您所需的列的值。 - Koen
1个回答

11

嗯,在您的情况下,您需要一个来保存您的列:

public class MyClass
{
   public int Id { get; set; }
   public int TypeId { get; set; }
   public bool AllowedSMS { get; set; }
   public string TimeSpan { get; set; }  
   public decimal Price { get; set; }
   public string TypeName { get; set; } 
}

当然,由于你没有定义那些列的数据类型,这只是一个猜测 - 你可能需要根据具体需求进行调整。

现在,你需要遍历SqlDataReader并从数据读取器中获取值,并填充你新创建的类:

using (SqlDataReader dr = cmd.ExecuteReader())
{
   List<MyClass> results = new List<MyClass>();

   while(dr.Read())
   {
       MyClass newItem = new MyClass();

       newItem.Id = dr.GetInt32(0);  
       newItem.TypeId = dr.GetInt32(1);  
       newItem.AllowedSMS = dr.GetBoolean(2);  
       newItem.TimeSpan = dr.GetString(3);
       newItem.Price = dr.GetDecimal(4);
       newItem.TypeName = dr.GetString(5);

       results.Add(newItem);
   }
}

// return the results here, or bind them to a gridview or something....

1
您可以使用对象初始化器来美化此代码 - newItem ;) - usefulBee
有没有一种方法(也许是使用Linq?)可以选择或将SqlDataReader dr强制转换为List < MyClass>,而不是使用dr.Read()迭代每个记录?类似于Lambda.Select(a => new MyClass(){ Id = a.Id, TypeId = a.TypeId })之类的方式吗? - jbwebtech

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