【发布时间】:2011-04-28 00:01:58
【问题描述】:
我们已经构建了一个内部工具来生成整个数据访问,每个表都有一个代表它的数据和所有常见操作的类。(想想轻量级实体框架)。
这些 DataAccess 对象总是有一个接收连接字符串的构造函数和一个接收 SqlDataReader 的 Load 函数。
类似这样的:
class Customer
{
public string ConnStr;
public int Id;
public string Name;
Public customers(string connStr)
{
ConnStr = connStr;
}
public Customer Load(SqlDataReader)
{
if(reader.Read())
{
Id = reader["Id"].ToString();
Name = reader["Name"].ToString();
}
}
}
我想编写一个实用程序数据访问静态方法,该方法允许我编写我的 SQL 并获得一个对象列表作为回报,遵循前面的对象示例:
string SQL = "SELECT * FROM Customers WHERE Name=@Name";
List<Customer> customers = GetList<Customer>(connStr, SQL, new SqlParameters("@Name", "John"));
我不知道如何处理它,我尝试过接口,但它们不允许构造函数或静态方法,并且使用泛型 - 我无法调用初始化对象所需的方法(构造函数 +加载),这是我最近的尝试,注释掉了不起作用的部分:
public static List<T> GetList<T>(string connStr, string SQL, params SqlParameter[] prms)
{
List<T> list = new List<T>();
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
SqlCommand cmd = new SqlCommand(SQL, conn);
foreach (SqlParameter param in prms)
{
cmd.Parameters.Add(param);
}
using (SqlDataReader reader = cmd.ExecuteReader())
{
//T item = new T(connStr);
//item.Load(reader);
//list.Add(item);
}
}
return list;
}
顺便说一句,我们有兴趣开源我们的 DataAccess 生成器,这太棒了 - 它允许非常有效地访问数据库对象 + 创建一个 javascript 数据访问层,让您可以从 javascript 完全控制您的数据库(当然这有安全隐患可以管理)。
如果这里有人知道如何“开源”这样的项目或任何想加入该产品开发的公司 - 请随时与我联系:eytan@titkadem.co.il
提前致谢, 伊坦
【问题讨论】:
-
OT,但从纯粹主义者的角度来看,那些域对象对持久性了解很多,这不一定是他们的责任。我还认为 DataContext 可以为您完成大部分绑定,而无需实体中的任何数据访问代码,免费
ExecuteQuery<T> -
Lasse 提出了一个有趣的观点,即谁调用了 Read;在许多方面,最好接受
IDataRecord而不是IDataReader/SqlDataReader- 假设它们只需要一行。
标签: c# asp.net generics data-access-layer