我正在编写一种从数据库中返回"资产"行的方法.它包含字符串,整数和字节数组(可以是图像/电影/文档).
现在对于大多数行访问,我使用以下方法返回NameValueCollection,因为它是一个轻量级对象,易于使用和转换int和字符串.
public static NameValueCollection ReturnNameValueCollection(Database db, DbCommand dbCommand) { var nvc = new NameValueCollection(); using (IDataReader dr = db.ExecuteReader(dbCommand)) { if (dr != null) { while (dr.Read()) { for (int count = 0; count < dr.FieldCount; count++) { nvc[dr.GetName(count)] = dr.GetValue(count).ToString(); } } } } dbCommand.Dispose(); return nvc.Count != 0 ? nvc : null; }
现在我对这种数据访问的apporach通常是获得一个返回数据流的方法.
public static DataRow ReturnDataRow(Database db, DbCommand dbCommand) { var dt = new DataTable(); using (IDataReader dr = db.ExecuteReader(dbCommand)) if (dr != null) dt.Load(dr); dbCommand.Dispose(); return dt.Rows.Count != 0 ? dt.Rows[0] : null; }
创建一个DataTable然后返回它的第一个数据流似乎有点浪费.
有没有更好的方法来做到这一点?
我想的可能是一个对象词典,然后我手动转换每个成员.
看看别人如何解决这个问题会很有趣.我知道这种情况属于微优化领域,只要我没有为每一行查询返回DataSet(希望每次我在一行代码中看到它都有一个磅)它应该没问题.
也就是说,可能会在一个盒子上的所有站点上调用此方法来分配数据访问查询.
干杯
史蒂夫
怎么样了?
您是否有没有对象容器代表数据库中的行?在解决方案的其他层中创建自定义对象更容易处理.因此,采用这种方法,有两种非常可行的解决方案可以解决您的问题.
假设您有一个代表数据库中的产品的自定义对象.你可以像这样定义对象:
public class Product { public int ProductID { get; set; } public string Name { get; set; } public byte[] Image { get; set; } }
而且你要填写这样的产品(Collection)集合:
var collection = new Collection(); using (var reader = command.ExecuteReader()) { while (reader.Read()) { var product = new Product(); int ordinal = reader.GetOrdinal("ProductID"); if (!reader.IsDBNull(ordinal) { product.ProductID = reader.GetInt32(ordinal); } ordinal = reader.GetOrdinal("Name"); if (!reader.IsDBNull(ordinal)) { product.Name = reader.GetString(ordinal); } ordinal = reader.GetOrdinal("Image"); if (!reader.IsDBNull(ordinal)) { var sqlBytes = reader.GetSqlBytes(ordinal); product.Image = sqlBytes.Value; } collection.Add(product); } }
请注意,我正在通过阅读器的Get x检索值,其中x是我想从列中检索的类型.这是Microsoft建议的按照http://msdn.microsoft.com/en-us/library/haa3afyz.aspx(第二段)检索列数据的方法,因为检索到的值不必装入System.Object并取消装入原始类型.
既然您提到在ASP.NET应用程序中多次调用此方法,您可能需要重新考虑这样的通用方法.用于返回NameValueCollection的方法在此方案中非常不具有性能(可以说在许多其他方案中).更不用说您将每个数据库列转换为字符串而不考虑当前用户的文化,而文化是ASP.NET应用程序中的一个重要考虑因素.我认为这个NameValueCollection也不应该用在你的其他开发工作中.我可以继续谈论这个,但我会救你的咆哮.
当然,如果您要创建直接映射到表的对象,您可以查看LINQ to SQL或ADO.NET Entity Framework.你会很开心的.