【发布时间】:2012-01-09 18:52:58
【问题描述】:
与同事发生分歧,而我此时不在乎谁是对的,我更好奇哪个是更好的解决方案,以便我可以继续使用它。
我们有不同的方式来访问一个系统。
选项 #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
【问题讨论】:
-
性能测试这两种方法并自己获得答案。
-
“确实效率低下,因为它首先创建了一个数据库”是主观的,顺便说一句
-
请在此处的代码上制作 cmets,而不是直接编辑它。 (附注是由其他用户添加的),我同意这是主观的。为什么真的效率低下?这就是我正在努力学习的。而且他们都碰巧使用了 CreateDatabase()
-
Oded - 我以前从未这样做过。除了在每次通话之前和之后添加开始时间/停止时间之外,我还可以使用首选资源吗?
标签: c# asp.net sql-server coding-style data-access-layer