简介
本系列的最后一篇文章.第一部分如何描述,二部分如何取得描述.现在我们就要创建DAL库来使我们的标题可行.
设计DAL库
我想创建的类库支持Sqlserver 和oledb.我把库分成了以下的部分:
Utility classes
class DALQueryBuilder
生成sql语句更新物件.
class DALParameter
生成参数保存在存储过程中.
class DALException
继承于System.Exception , 数据库有异常时将会提供更多的信息.
Attribute classes
参见第一篇.
DAL 本身
class DALEngine
这个抽象的类用于数据库操作,是数据库程序更加简单.它的虚拟和抽象的方法有不同的实施.
class DALSqlEngine
class DALOleDbEngine
耧一眼DALEngine 类public abstract class DALEngine : IDisposable { IDbConnection conn = null; string connectionString = ""; ArrayList parameters = new ArrayList(); bool canClose = true; public DALEngine(string connectionString); public bool CanClose; public string ConnectionString; protected IDbConnection Connection; protected ArrayList Parameters; public void Close(); public void Dispose();
protected abstract IDbConnection GetConnection(); protected abstract IDbCommand CreateCommand(string spName); public abstract void ExecSP_DataSet(string spName, DataSet dataSet, string tableName); public abstract void ExecQuery_DataSet(string query, DataSet dataSet, string tableName); public DALParameter GetParameter(string name); void UpdateOutputParameters(IDbCommand cmd); public void AddParameter(DALParameter param); public void ClearParameters(); public IDataReader ExecSP_DataReader(string spName); public IDataReader ExecSP_DataReader(string spName,
CommandBehavior behavior); public object ExecSP_Scalar(string spName); public int ExecSP_NonQuery(string spName); public IDataReader ExecQuery_DataReader(string query,
CommandBehavior behavior); public IDataReader ExecQuery_DataReader(string query); public object ExecQuery_Scalar(string query); public int ExecQuery_NonQuery(string query); public static object CreateFromReader(IDataReader reader, Type objType); public object RetrieveObject(object keyValue, Type objType); public int RetrieveChildObjects(object foreignKeyValue, ArrayList objects, Type childType); void UpdateObjectSql(object o, DataTableAttribute dataTable); void UpdateObjectStoredProcedure(object o, DataTableAttribute dataTable); public void UpdateObject(object o); public void UpdateObjects(IEnumerable enumObjects); } public class DAL : DALSqlEngine { const string CONN_STRING = "server=localhost;uid=sa;pwd=;database=pubs"; public DAL() : base(CONN_STRING) { } public ArrayList GetCustomerDependents(Customer customer) { ArrayList result = new ArrayList(); RetrieveChildObjects(customer.Id, result, typeof(CustomerDependent)); return result; } public void UpdateCustomerDependents(Customer customer) { UpdateObjects(customer.Dependents); } }
看个例子: public static void Main() { DAL dal = new DAL(); try { Contact contact = new Contact(); contact.Name = "Joao Cardoso"; contact.Age = 23; contact.Address = "Av. Rio Branco, 202/121"; contact.Address2 = "Centro"; contact.PostalCode = "09029-901"; contact.City = "Sao Paulo"; contact.State = "SP"; contact.Country = "Brazil"; dal.UpdateObject(contact); Console.WriteLine(contact); Contact joaoCardoso = (Contact)dal.RetrieveObject(1, typeof(Contact)); joaoCardoso.Age++; Console.WriteLine(joaoCardoso); Console.WriteLine(""); Customer customer = new Customer(); customer.Name = "Paul Noyter"; customer.Age = 34; customer.Address = "All St, 2202/2121"; customer.Address2 = "Downville"; customer.PostalCode = "90931"; customer.City = "Los Angeles"; customer.State = "CA"; customer.Country = "United States"; customer.TotalPurchased += 1900.87M; customer.NumberOfPurchases++; dal.UpdateObject(customer); Customer paul = (Customer)dal.RetrieveObject(1, typeof(Customer)); Console.WriteLine(paul); paul.TotalPurchased += 100M; paul.NumberOfPurchases++; dal.UpdateObject(paul); if (paul.Dependents.Count == 0) { CustomerDependent dependent = paul.NewDependent(); dependent.Name = "Marie Noyter"; dependent.Age = 31; paul.Dependents.Add(dependent); dependent = paul.NewDependent(); dependent.Name = "Mark Noyter"; dependent.Age = 10; paul.Dependents.Add(dependent); dependent = paul.NewDependent(); dependent.Name = "Claudia Snorg"; dependent.Age = 32; dependent.Relationship = CustomerRelationship.Friend; paul.Dependents.Add(dependent); dal.UpdateCustomerDependents(paul); } else { Console.WriteLine("Dependents of {0}", paul.Name); foreach(CustomerDependent dependent in paul.Dependents) { Console.WriteLine("<Dependent>{0} - {1} [{2}]", dependent.Id, dependent.Name, dependent.Relationship); dependent.Relationship = CustomerRelationship.Family; } dal.UpdateCustomerDependents(paul); } } finally { dal.Dispose(); } }
Conclusion
有老多局限性,需要我们去进一步实施思考,但是你理解了这些以后,我们就可以进行nhibernate的理解研究和应用了,祝你好运. 
|