数据库
首页 > 数据库> > 哪个是连接数据库的更有效方法?

哪个是连接数据库的更有效方法?

作者:互联网

与同事之间存在分歧,我目前不在乎谁是对的,我很好奇这是更好的解决方案,因此我可以继续使用它.

我们有不同的方式访问系统.

选项1:
使用下面的代码创建数据库.

using Microsoft.Practices.EnterpriseLibrary.Data;

namespace Ivans.Healthcare.CommercialAccess.Data
{
    public abstract class DataAccess : DataHelperBase
    {
        public const int commandTimeout = 7200;
        private static Database m_db = null;
        public StringBuilder Status {get; set;}

        public DataAccess()
        {
            this.Status = new StringBuilder();

            if (m_db == null)
            {
                bool bIfRunsOnWebService = false;
                try
                {
                    if (DynamicConfigurationManager.AppSettings["WebService"] != null)
                    {
                        bIfRunsOnWebService = true;
                    }
                }
                catch {}

                if (!bIfRunsOnWebService)
                {
                    m_db = DatabaseFactory.CreateDatabase(DataAccessResource.IDS_DB_ALIAS);
                }
                else
                {
                    m_db = CreateDatabase(DataAccessResource.IDS_WS_DB_ALIAS);
                }
            }
        }

然后,每次需要调用存储过程时,该方法将包含以下内容:

public IEnumerable<InquiryServiceType> GetActive(bool is5010)
{

    Database db = getDB();
    DbCommand dbCmd = db.GetStoredProcCommand(DataAccessResource.IDS_SP_SEL_InquiryServiceTypeData_ListServiceTypes);
    db.AddInParameter(dbCmd, DataAccessResource.IDS_SP_SEL_InquiryServiceTypeData_ListServiceTypes_Is5010Request, DbType.Boolean, is5010);

    DataSet ds = new DataSet();
    db.LoadDataSet(dbCmd, ds, new string[] { DataAccessResource.IDS_TBL_InquiryServiceTypeData });

    return DataSetTranslator.TranslateInquiryServiceTypeDataSet(ds);
}

选项2

此选项更具模块化,并正在尝试创建通用数据库方法.

    private Database currentDB;
private const int commandTimeout = 7200;

public DataAccess(Common.Enums.ConnectionString currentConnection)
{
    currentDB = DatabaseFactory.CreateDatabase(currentConnection.ToDescription());
}

public IEnumerable<T> SelectMany<T>(string spName, params Param[] parameters) where T : IDataPopulate<T>, new()
{
    var storedProcedure = CreateStoredProcedureCommand(spName);
    AddParameters(storedProcedure, parameters);

    IDataReader myReader = null;
    IList<T> listOfItems = new List<T>();

    try
    {
        myReader = currentDB.ExecuteReader(storedProcedure);
        if (myReader == null)
        {
            return listOfItems;
        }

        while (myReader.Read())
        {
            listOfItems.Add(new T().FillObject(myReader));
        }

        return listOfItems;
    }
    catch (Exception ex)
    {
        string message = string.Format("Error Message: {0}\r\nStored Procedure: {1}\r\n", ex.ToString(), spName);
        throw new Exception(message);
    }
    finally
    {
        DataAccessDisposal.DataReader(myReader);
        DataAccessDisposal.StoredProcedure(storedProcedure);
    }
}

然后调用数据库将如下所示:

public IEnumerable<InquiryServiceTypes> GetAll(int payerID)
{
    Param payerIdParam = new Param("@payerID", DbType.Int32, payerID);
    return dataAccess.SelectMany<InquiryServiceTypes>("dbo.proc_PayersInquiryServiceTypesSel", payerIdParam);
}

结论

肯定每个部分中的代码编码都不正确.我很确定有一个中间点是最有效的代码.

上面的代码有两点效率低下.首先是它如何首先连接到数据库.第二个是一旦返回数据,您将如何处理它.我很想讨论两者,但觉得就这一点而言,第一个更为重要.

谢谢,
C

解决方法:

我会简单地说:有些抽象已经做到了(并且做得很好).如果您可以处理创建连接的操作,例如,使用dapper-dot-net

return connection.Query<InquiryServiceTypes>(
        "dbo.proc_PayersInquiryServiceTypesSel",
        new { payerId }, commandType: CommandType.StoredProcedure);

它将在高速缓存的IL中为您编写所有参数化和实现.无需编写复杂的Fill方法或populate方法,而且非常快速(与手动编写所有ADO.NET读取器代码的性能相同,但无聊的代码和错别字的机会).

手动编写所有这些Fill方法效率不高(对于开发人员而言).

注意上面的内容;匿名类型定义了参数,即说“存在一个名为payerId的int参数,其值与传入的值相同”.您还可以拥有:

new { id = payerId, name = "abc", allData = true }

这将在@id(int)中添加来自payerId的值,在@name(nvarchar)中添加值“ abc”,并在@allData(位)中添加值1.

编辑评论中的要点:

>连接池是正交的,因为只要您立即释放连接,默认情况下就会自动完成(使用SQL Server)
> entlib毫无理由地增加了IMO的开销.与entlib对话的代码实际上与与ado.net对话的代码相同,除了具有更多的膨胀和间接性.我会避免使用entlib,除非您实际使用它来简化您的生活
>加载数据集始终是开销; DataTable等很复杂-比加载POCO模型要复杂得多.只是加载数据集,以便随后可以使用数据集加载对象模型效率低下,并且会在需要收集的堆上创建不必要的垃圾,并且仍然有很多步骤(适配器等),所有这些步骤都需要时间
> DataTable方法还要求完全读取一个表,而不是非缓冲的假脱机(可以使用原始读取器和迭代器块);如果结果非常好,这可能很重要
在介绍的两种方法中,第二种是IMO更好的选择,但是我不喜欢这种界面;那是糟糕的“关注点分离”-POCO的工作是代表一个域对象,而不是了解数据库
>如上所述,有些选项类似于第二种选项,它们的实现/维护工作量少得多,并且不会引入SoC问题;我会很感兴趣地看这个
>这些选项还可以为您解决更复杂的情况;多个网格;水平连接(进入子对象);等等

标签:coding-style,data-access-layer,asp-net,c,sql-server
来源: https://codeday.me/bug/20191102/1987609.html