Мы создали внутренний инструмент, который генерирует весь доступ к данным, у каждой таблицы есть класс, который представляет ее данные и все общие операции (представьте себе легковесную платформу Entity).
Эти объекты DataAccess всегда имеют конструктор, который получает строку подключения, и функцию Load, которая получает SqlDataReader.
Примерно так:
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"));
Я почему-то не могу понять, как с этим справиться, я пробовал интерфейсы, но они не позволяют конструкторы или статические методы, и используют обобщенные типы - я не могу вызвать методы, которые мне нужны для инициализации объекта (constructor + загрузить), вот моя последняя попытка, закомментированный раздел, который не работает:
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
Заранее спасибо,
Эйтан