使用属性和反射过渡从数据存取层到业务物件 - III

简介

本系列的最后一篇文章 . 第一部分如何描述 , 二部分如何取得描述 . 现在我们就要创建 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


{


    //


    // private data members


    //


    IDbConnection conn       = null;


    string connectionString  = "";


    ArrayList parameters = new ArrayList();


    bool canClose = true;


 


 


    // constructor


    public DALEngine(string connectionString);


 


    public bool CanClose;


    public string ConnectionString;


 


 


    protected IDbConnection Connection;


    protected ArrayList Parameters;


 


    public void Close();


    public void Dispose();


 


 


    //


    // methods that must be override with a specific data provider 


    // implementation please see the implementation of DALSqlEngine 


    // or DALOleDbEngine  

    // 


    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);


 


 


    //


    // related to stored procedure parameters


    //


    public DALParameter GetParameter(string name);


    void UpdateOutputParameters(IDbCommand cmd);


    public void AddParameter(DALParameter param);


    public void ClearParameters();


 


 


    //


    // for those that use stored procedures


    //


    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);


 


 


    //


    // methods for those that use plain SQL statements


    //


    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);


 


 


 


 


    //


    // Business objects methods


    //


    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("
 1<dependent>{0} - {1} [{2}]", dependent.Id, 
 2    
 3    
 4                                      dependent.Name, dependent.Relationship);
 5    
 6    
 7                    dependent.Relationship = CustomerRelationship.Family;
 8    
 9    
10                }
11    
12    
13     
14    
15    
16                dal.UpdateCustomerDependents(paul);
17    
18    
19            }
20    
21    
22     
23    
24    
25        }
26    
27    
28        finally
29    
30    
31        {
32    
33    
34            dal.Dispose();
35    
36    
37        }
38    
39    
40    }
41
42##  Conclusion 
43
44有老多局限性  ,  需要我们去进一步实施思考  ,  但是你理解了这些以后  ,  我们就可以进行  nhibernate  的理解研究和应用了  ,  祝你好运  .</dependent>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus