データベースから単一または複数のレコードを取得できる静的クラスにデータ リーダーがあります。これは、ASP.net アプリケーションで使用されます。しかし、最近奇妙な問題が発生しており、現在のメソッド構造が問題の原因ではないかと考えています。ときどき、データ リーダーがまだ開いているというエラーが表示されます。それ以外の場合は、サーバー タイムアウトが発生します。
これは、データベースからデータを取得する静的クラスの 1 つの例です。簡潔にするために、この例のメソッドの量を "get" 構造に減らしました。したがって、Reference 型の 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()
}
}