为了访问我的数据库并使用我的存储过程,我创建了这个非常简单的数据访问层(如果有人可以称之为“层”)。我有8个文件,每个文件看起来像:
using System;
using System.Data;
using System.Data.Common;
using Microsoft.Practices.EnterpriseLibrary.Data;
public class TasksDBHandler
{
private static Database db = DatabaseFactory.CreateDatabase("DBNAME");
public static void SetTaskDepreciationData(long taskId, long fieldId, string value)
{
DbCommand command = db.GetStoredProcCommand("dbo.P_CUS_TSK_SetTaskDepreciationData");
db.AddInParameter(command, "@task_id", DbType.Int64, taskId);
db.AddInParameter(command, "@field_id", DbType.Int64, field);
db.AddInParameter(command, "@value", DbType.String, value);
db.ExecuteNonQuery(command);
}
//Many more stored procedures calls
}
我想构建一个新的更好的数据访问层,但我不知道它应该是什么样子。我希望能够使用存储过程而无需为每个存储过程编写静态方法,我希望更好的连接管理等等/
有没有人知道怎么做?
我正在使用.Net和SQL SERVER。
答案 0 :(得分:3)
你看过那里的任何ORM产品吗?有Linq2Sql,实体框架,NHibernate等。除非您需要做的是非常基本的,否则学习使用现有框架可能会比尝试编写自己的框架更好。
在像Entity Framework这样的ORM中,通常不会手动管理连接,它会从数据库中定义对象(或实体)模型,而“上下文”则负责从数据库中检索数据并映射数据。到实体模型中类的正确属性。因此,您从上下文中请求某些内容,它将满足您的请求所需的数据加载到内存中,您像其他类一样使用它,然后告诉上下文将您的更改保存回数据库。有几种方法可以在实体框架中与您的实体模型进行交互,但我将使用的示例是Linq2Entities。您编写了一个Linq查询,上下文负责将其转换为针对数据库的查询* 免责声明:我没有尝试运行此代码,它只是用作示例
using(MyEntitiesContext context = new MyEntitiesContext())
{
var idleUsers = from u in context.User
where u.LoggedIn && u.LastActivity > DateTime.Now.AddMinutes(-30)
select u;
foreach(User u in idleUsers)
{
u.Status = UserStatus.Idle;
}
context.SaveChanges();
}
显然幕后有很多事情要发生:
您应该能够找到有关实体框架的大量信息,但我发现学习的最简单方法是跳入并开始尝试做某事,然后在问题出现时找到问题的答案。我不会立即尝试使用它来做一些非常关键或时间敏感的事情,因为肯定会有一个学习曲线,一旦你遇到一些陷阱,你就会学会更好的方法。
这是一个link to Microsoft's Entity Framework 4 Quickstart,可以给你一些相当简单的尝试。玩得开心!