【问题标题】:Is this the fastest and efficient way to retrieve data from the database?这是从数据库中检索数据的最快、最有效的方法吗?
【发布时间】:2011-03-14 01:39:20
【问题描述】:

这是从数据库检索数据到业务逻辑层的最快、最有效的方法吗?

public static DataTable Getdata(Guid companyId)
{
    DbCommand command = db.GetStoredProcCommand("dbo.P_GetData");
    db.AddInParameter(command, "@company_id", DbType.Guid, companyId);
    IDataReader reader = db.ExecuteReader(command);
    DataTable data = new DataTable();
    data.Load(reader, LoadOption.OverwriteChanges);
    reader.Close();
    return data;
}

【问题讨论】:

  • 我会将db.ExecuteReader() 语句放在using 块中,以防在data.Load() 期间发生异常,导致reader.Close() 不被调用。

标签: c# .net tsql


【解决方案1】:

根据 nawfal 的基准:

出于某种原因Fill():

dataAdapter.Fill(dataSet);

Load()

dataTable.Load(dataReader);

例如,这样的事情可能比你现有的快 4-5 倍:

using (var da = new MySqlDataAdapter())
{
    using (da.SelectCommand = conn.CreateCommand())
    {
        da.SelectCommand.CommandText = query;
        DataSet ds = new DataSet();
        da.Fill(ds);
        return ds.Tables[0];
    }
}

查看他的回答了解更多细节和基准时间。

【讨论】:

    【解决方案2】:

    这取决于您的要求..

    有很多方法可以从数据库中检索数据。

    在 Ado.net 中可以使用数据阅读器和数据适配器。他们都有自己的优势。

    你也可以使用 Linq to sql

    并检查此性能比较:数据访问技术

    http://msdn.microsoft.com/en-us/library/ms978388.aspx

    问候。

    【讨论】:

      【解决方案3】:

      假设您的逻辑层需要DataTable,并忽略其他编码问题和要求,这可能很快。

      您有理由相信它对于您的需求来说太慢了吗?如果是这样,请尝试不同的方法,不要忽视:

      • 运行查询的存储过程使用的逻辑,以及它生成的计划
      • 存储过程返回的数据量(您需要所有这些列吗?)
      • 干预网络的带宽(如果有)

      编辑:如果我正在做这样的事情,如果我正在使用大小合理的数据模型,并且如果我对业务层有影响,我会使用持久性框架(如Entity Framework)而不是比直接 ADO.NET。不过,我不会出于性能原因这样做 - 从长远来看,持久层更易于维护。

      【讨论】:

      • 我只是想知道这是否是正确和最好的方法。
      • @Naor,如果我正在做这样的事情,并且我对 BLL 有影响,我会使用持久层(如实体框架)而不是 ADO.NET。从长远来看更易于维护。
      • 正确和最好的方法可能因您的要求和计算环境而异。
      猜你喜欢
      • 2012-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 2014-09-04
      • 1970-01-01
      • 1970-01-01
      • 2018-01-05
      相关资源
      最近更新 更多