当前位置:  开发笔记 > 编程语言 > 正文

在ASP.NET中从DB获取一行数据的最有效方法

如何解决《在ASP.NET中从DB获取一行数据的最有效方法》经验,为你挑选了1个好方法。

我正在编写一种从数据库中返回"资产"行的方法.它包含字符串,整数和字节数组(可以是图像/电影/文档).

现在对于大多数行访问,我使用以下方法返回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(希望每次我在一行代码中看到它都有一个磅)它应该没问题.

也就是说,可能会在一个盒子上的所有站点上调用此方法来分配数据访问查询.

干杯

史蒂夫



1> Michael Nero..:

怎么样了?

您是否有没有对象容器代表数据库中的行?在解决方案的其他层中创建自定义对象更容易处理.因此,采用这种方法,有两种非常可行的解决方案可以解决您的问题.

假设您有一个代表数据库中的产品的自定义对象.你可以像这样定义对象:

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.你会很开心的.


检索值,其中
是我想从列中检索的类型.这是Microsoft建议的按照
的方法在此方案中非常不具有性能(可以说在许多其他方案中).更不用说您将每个数据库列转换为字符串而不考虑当前用户的文化,而文化是ASP.NET应用程序中的一个重要考虑因素.我认为这个
也不应该用在你的其他开发工作中.我可以继续谈论这个,但我会救你的咆哮.
推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有