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

来源:互联网 发布:华泰证券交易软件ios 编辑:程序博客网 时间:2024/05/22 05:24

简介

本系列的最后一篇文章.第一部分如何描述,二部分如何取得描述.现在我们就要创建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("<Dependent>{0} - {1} [{2}]", dependent.Id, 
                                  dependent.Name, dependent.Relationship);
                dependent.Relationship = CustomerRelationship.Family;
            }
 
            dal.UpdateCustomerDependents(paul);
        }
 
    }
    finally
    {
        dal.Dispose();
    }
}

Conclusion

有老多局限性,需要我们去进一步实施思考,但是你理解了这些以后,我们就可以进行nhibernate的理解研究和应用了,祝你好运.

原创粉丝点击