适当的.net datareader设置建议

时间:2013-09-05 16:33:33

标签: c# asp.net ado.net

我在静态类中有一个数据读取器,允许我从数据库中获取单个或多个记录。这用于ASP.net应用程序。但是,我们最近遇到了一些奇怪的问题,我想知道我当前的方法结构是否可能是导致问题的原因。有时我会收到一条错误,指出数据阅读器仍处于打开状态。其他时候服务器超时发生。

这是我从数据库中获取数据的一个静态类的示例。为了简洁起见,我将此示例中的方法数量减少到了“get”结构。因此,如果我想返回类型为List的List,我将调用以下格式为aspx.cs文件。

List<Reference> ref = ReferenceAdapter.GetAllByType(......);

非常感谢任何见解。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using DbProvider;
using MyBusinessModelLayer;

namespace MyDataAccessLayer
{
    public static class ReferenceAdapter //: IReferenceAdapter
    {
    static IDbProvider _dbProvider;

    static ReferenceAdapter()
    {
        Initialize();
    }

    private static void Initialize()
    {
        _dbProvider = new SqlDbProvider(Config.SqlConnectionString);
    }

    public static List<Reference> GetAllByType(ReferenceType referenceType)
    {
        return GetAllByType(referenceType, false);
    }

    public static List<Reference> GetAllByType(ReferenceType referenceType, bool isIncludeDeleted)
    {
        Hashtable hIn, hOut;
        string sp;

        sp = "[ReferenceSelectAllByReferenceType]";

        hIn = new Hashtable();
        hIn.Add("@ReferenceType", referenceType.ToString());
        if (!isIncludeDeleted)
        {
            hIn.Add("@Deleted", false);
        }

        hOut = new Hashtable();
        hOut.Add("@RTNStatus", 0);

        return GetMultipleFromDb(sp, hIn, hOut, CommandType.StoredProcedure);
    }

       private static List<Reference> GetMultipleFromDb(string sSql, Hashtable hInputParameters)
    {
        return GetMultipleFromDb(sSql, hInputParameters, new Hashtable(), new CommandType());
    }

    private static List<Reference> GetMultipleFromDb(string sSql, Hashtable hInputParameters, CommandType cType)
    {
        return GetMultipleFromDb(sSql, hInputParameters, new Hashtable(), cType);
    }

    private static List<Reference> GetMultipleFromDb(string sSql, Hashtable hInputParameters, Hashtable hOutputParameters, CommandType cType)
    {
        IDbCommand dbCommand = _dbProvider.Select(sSql, hInputParameters, hOutputParameters, cType);
        var lo = new List<Reference>();

        using (IDataReader dr = dbCommand.ExecuteReader())
        {
            while (dr.Read())
                lo.Add(GetObjectFromDataRecord(dr));
        }
        dbCommand.Connection.Close();
        return lo;
    }// GetMultipleFromDb()

    private static Hashtable GetParametersFromObject(Reference o)
    {
        Hashtable h = new Hashtable();
        h.Add("@ReferenceShortName", o.ShortName);
        h.Add("@ReferenceLongName", o.LongName);
        h.Add("@ReferenceDescription", o.Description);
        h.Add("@ReferenceType", o.Type.ToString());
        h.Add("@ReferenceSortKey", o.SortKey);

        return h;
    }// GetParametersFromObject()

    private static Reference GetObjectFromDataRecord(IDataRecord dr)
    {
        Reference o = new Reference();

        o.ReferenceId = dr["ReferenceID"].DBNullToInt();
        o.ShortName = dr["ReferenceShortName"].ToString();
        o.LongName = dr["ReferenceLongName"].ToString();
        o.Description = dr["ReferenceDescription"].ToString();
        o.Type = (ReferenceType)Enum.Parse(typeof(ReferenceType), dr["ReferenceType"].ToString(), true);
        o.SortKey = dr["ReferenceSortKey"].DBNullToInt();
        o.Created = dr["CreatedDate"].DBNullToDateMinVal();
        o.CreatedBy = dr["CreatedBy"].DBNullToInt();
        o.Updated = dr["UpdatedDate"].DBNullToDateMinVal();
        o.UpdatedBy = dr["UpdatedBy"].DBNullToInt();
        o.Deleted = Convert.ToBoolean(dr["Deleted"]);
        o.Deletable = GetAssetReferenceCount(o.Type, o.ReferenceId);

        return o;
    }// GetObjectFromDataRecord()
}

}

1 个答案:

答案 0 :(得分:1)

重写您的代码,以便没有静态的共享对象。最有可能的是,随着您的站点被越来越多的用户使用,您的静态方法会重用静态资源,从而导致并发问题。

而不是

List<Reference> ref = ReferenceAdapter.GetAllByType(......);

你可以

using ( var adapter = new ReferenceAdapter() )
{
   List<Reference> ref = adapter.GetAllByType();
}

这不仅会创建一个新实例,因此不存在并发问题,而且还可以确保资源正确处理。

您确定通过编写自己的数据访问层来重塑事物是一种正确的方法吗?考虑到您缺乏经验,使用现有框架(如orm或micro-orm)听起来更安全。人们在类似的问题上吃了很多东西,比你早几年,他们通过设计现成的图书馆来分享经验。