以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 Dot NET,C#,ASP,VB 』  (http://bbs.xml.org.cn/list.asp?boardid=43)
----  个人开发框架总结  (http://bbs.xml.org.cn/dispbbs.asp?boardid=43&rootid=&id=78130)


--  作者:卷积内核
--  发布时间:11/9/2009 5:12:00 PM

--  个人开发框架总结
在开发过程中,大家可能都发现,形成一套个人开发风格是相当重要,这也可以延伸为整个团队的开发模式,甚至形成一个有形的开发框架。

   我经过这一两年的摸索,不断的完善,现在大体形成了几个东东,自己感觉还不错,所以想贴出来与大家一起分享,如有需要的朋友,可以直接与我联系。

   大体有以下几个类库:

   FaibClass.Data 数据访问库

   FaibClass.Common.Windows WinForm框架库

   FaibClass.Windows.Forms WinForm控件库(目前只有TreeList及一些TextBox控件)

   FaibClass.Update 在线更新库

   在以后的几天里将分别做一些介绍

  一、FaibClass.Data

   主要是提供数据访问操作的类库,可支持SqlServer、Oracle、及各种OleDb数据库。

   DataHelper 核心类 提供各种数据访问方法。先说一下它的几个方法和属性:

   ExecuteDataTable 填充数据到DataTable,共12种重载

   ExecuteNonQuery 执行Sql语句

   ExecuteReader 执行查询语句返回IDataReader

   ExecuteScalar 执行查询,返回当个结果

   FillDataset 填充DataSet,共12种重载

   FillModelList 填充DataList,共12种重载

   Update 更新DataTable或DataSet,共6种重载

   BeginTransaction 开始事务,支付分布式事务

   CommitTransaction 提交事务

   RollbackTransaction 回滚事务

   CreateParameters 创建参数集,因为使用存储过程时SqlServer和Oracle的参数名称不一样,故用这个方法生成

   OpenUpdateBag 打开更新开关,在使用Update前,要使用这个方法把相应的sql语句保存到内存中,以在Update时能够更新到数据库

   CloseUpdateBag 关闭更新开关


--  作者:卷积内核
--  发布时间:11/9/2009 5:12:00 PM

--  
ParameterPrefix 当前数据操作的存储过程参数名称的前缀,如SqlServer的@和Oracle的:

   下面是具体的操作类型,SqlServer、Oracle、OleDb都是继承自DataHelper的,但并未为每一个操作类都写出各种数据操作的方法,这也主要是为了好维护,这几个类同时实现IDataProvider接口,这个接口就是为每种类型提供DbConnection、DbParameter、DataAdapter、DbCommand等。如SqlServer里是这样写到的:

    public class SqlServer : DataHelper, IDataProvider
{
        #region IDataConverter
        IDbConnection IDataProvider.GetDbConnection()
        {
            SqlConnection conn = new SqlConnection(ConnectionString);
            conn.StateChange += new StateChangeEventHandler(base.OnStateChange);
            return conn;
        }

        IDbDataAdapter IDataProvider.GetDataAdapter()
        {
            return new SqlDataAdapter();
        }

        IDataParameter IDataProvider.GetParameter()
        {
            return new SqlParameter();
        }

        IDataParameter[] IDataProvider.GetParameters(int Count)
        {
            return new SqlParameter[Count];
        }

        IDbCommand IDataProvider.GetCommand(IDbCommand command)
        {
            return command as SqlCommand;
        }

        void IDataProvider.GetCommandBuilder(IDbDataAdapter DataAdapter, DataTable DataTable, DataViewRowState dataViewRowState)
        {
            SqlDataAdapter adapter = (SqlDataAdapter)DataAdapter;
            SqlCommandBuilder cmdb = new SqlCommandBuilder(adapter);
        }
        #endregion
}


--  作者:卷积内核
--  发布时间:11/9/2009 5:12:00 PM

--  
这样,每一个类就好维护了,Oracle就使用OracleConnection,OleDb就使用OleDbConnection。

   Parameter 存储过程参数类,这跟System.Data里的差不多,都是实现同样的一个功能,只是说使用这个的时候,ParameterName不用具体的加入@或:这样的前缀。

   ParameterCollection 存储过程参数集合类,这里面特别的有几个方法

   FromDataModel 从模型转换为存储参数。可以根据具体的模型,将所有属性转换为存储过程参数,以为添加或修改作准备。

   Format 可以格式化Sql查询语句,比如在使用添加或修改的时候,可以这样使用

dataHelper.ExecuteNonQuery(params.Format("insert into table({0}) values({1})"), params);

dataHelper.ExecuteNonQuery(params.Format("update table set {0}"), params);

   BaseModel 数据模型基类,所有的数据模型都是继承这个类,如TB_BUY_BILL.cs

using System;
using FaibClass.Data;

namespace WindowsApplication1
{
    /// <summary>
    /// 模型类
    /// </summary>
    [Serializable]
    public class TB_BUY_BILL : BaseModel
    {
        #region 表映射
        /// <summary>
        /// 表名称
        /// </summary>
        public override string TableName
        {
            get { return "TB_BUY_BILL"; }
        }
        /// <summary>
        /// 表名称
        /// </summary>
        public static string _TableName = "TB_BUY_BILL";
        /// <summary>
        /// 主键
        /// </summary>
        public override string PrimaryKey
        {
            get { return "BUY_BILL_ID"; }
        }
        /// <summary>
        /// 主键
        /// </summary>
        public static string _PrimaryKey = "BUY_BILL_ID";

        public override DataColumn GetDataColumn(string ColumnName)
        {
            DataColumn column = new DataColumn();
            switch (ColumnName)
            {

                case "BUY_BILL_ID":
                    column.ColumnName = "BUY_BILL_ID";
                    column.ColumnSize = 200;
                    column.DbType = 16;
                    column.IsPrimaryKey = true;
                    column.Precision = 0;
                    column.Scale = 0;
                    return column;

                case "BILL_TYPE":
                    column.ColumnName = "BILL_TYPE";
                    column.ColumnSize = 0;
                    column.DbType = 10;
                    column.IsPrimaryKey = false;
                    column.Precision = 0;
                    column.Scale = 0;
                    return column;

                case "BILL_NO":
                    column.ColumnName = "BILL_NO";
                    column.ColumnSize = 200;
                    column.DbType = 16;
                    column.IsPrimaryKey = false;
                    column.Precision = 0;
                    column.Scale = 0;
                    return column;

                case "DEPARTMENT_NAME":
                    column.ColumnName = "DEPARTMENT_NAME";
                    column.ColumnSize = 200;
                    column.DbType = 16;
                    column.IsPrimaryKey = false;
                    column.Precision = 0;
                    column.Scale = 0;
                    return column;

                case "SALED_AMOUNT":
                    column.ColumnName = "DEPARTMENT_NAME";
                    column.ColumnSize = 0;
                    column.DbType = 11;
                    column.IsPrimaryKey = false;
                    column.Precision = 0;
                    column.Scale = 0;
                    return column;

                case "CONTRACT_AMOUNT":
                    column.ColumnName = "CONTRACT_AMOUNT";
                    column.ColumnSize = 0;
                    column.DbType = 11;
                    column.IsPrimaryKey = false;
                    column.Precision = 0;
                    column.Scale = 0;
                    return column;

            }
            return null;
        }
        #endregion

        #region 字段常量

        public static string _BUY_BILL_ID = "BUY_BILL_ID";
        public static string _BILL_NO = "BILL_NO";
        public static string _BILL_TYPE = "BILL_TYPE";
        public static string _DEPARTMENT_NAME = "DEPARTMENT_NAME";
        public static string _SALED_AMOUNT = "SALED_AMOUNT";
        public static string _CONTRACT_AMOUNT = "CONTRACT_AMOUNT";
        #endregion

        #region 成员

        private string m_BUY_BILL_ID;
        private BILL_TYPE m_BILL_TYPE;
        private string m_BILL_NO;
        private string m_DEPARTMENT_NAME;
        private decimal m_SALED_AMOUNT;
        private decimal m_CONTRACT_AMOUNT;
        #endregion

        #region 属性

        public string BUY_BILL_ID
        {
            get { return m_BUY_BILL_ID; }
            set { m_BUY_BILL_ID = value; }
        }

        public BILL_TYPE BILL_TYPE
        {
            get { return m_BILL_TYPE; }
            set { m_BILL_TYPE = value; }
        }

        public string BILL_NO
        {
            get { return m_BILL_NO; }
            set { m_BILL_NO = value; }
        }

        public string DEPARTMENT_NAME
        {
            get { return m_DEPARTMENT_NAME; }
            set { m_DEPARTMENT_NAME = value; }
        }

        public decimal SALED_AMOUNT
        {
            get { return m_SALED_AMOUNT; }
            set { m_SALED_AMOUNT = value; }
        }

        public decimal CONTRACT_AMOUNT
        {
            get { return m_CONTRACT_AMOUNT; }
            set { m_CONTRACT_AMOUNT = value; }
        }

        #endregion
    }

    public enum BILL_TYPE
    {
        [EnumText("电子")]
        ELE = 0,
        [EnumText("手工")]
        MAN = 1,
    }

    public enum BILL_STATE
    {
        [EnumText("暂存")]
        NoSave = 0,
        [EnumText("已保存")]
        Saved = 1,
    }

    /// <summary>
    /// 集合类
    /// </summary>
    [Serializable]
    public class TB_BUY_BILLs : DataModelList<TB_BUY_BILL>
    {
    }
}


--  作者:卷积内核
--  发布时间:11/9/2009 5:13:00 PM

--  
上面已经提到DataModelList这个类了,实际就是一个List<T>泛型,没有什么特殊的属性和方法。

   BaseDataAccess 数据操作类,这里面就整合了一些发新建实体、修改实体等方法。

   Create 新建实体

   Update 更新实体,共4种重载

   Delete 删除实体

   DeleteBy 删除多个实体

   Get 获得实体,共7种重载

   IsExitst 判别实体是否存在,共4种重载

   Select 查询实体集,共9种重载

   NewEntity 新实体

   PageArgs 分页参数

   相关的例子TB_BUY_BILL_DA.cs

using System;
using FaibClass.Data;

namespace WindowsApplication1
{
    /// <summary>
    /// 数据库类
    /// </summary>
    public class Database : OleDb
    {
        public Database()
        {
            base.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + AppDomain.CurrentDomain.BaseDirectory + "\test.mdb";
        }
    }

    /// <summary>
    /// DA操作类
    /// </summary>
    public class TB_BUY_BILL_DA : BaseDataAccess<TB_BUY_BILL, TB_BUY_BILLs>
    {
        public TB_BUY_BILL_DA() : base (new Database())
        {
        }
    }
}

   DataColumn 数据列映射类,主要标明数据字段的各种属性,比如数据类型等,在以上代码中,已经看到GetDataColumn方法了。


--  作者:卷积内核
--  发布时间:11/9/2009 5:13:00 PM

--  
EnumTextAttribute 枚举说明特性类,主要是添加在枚举上的,方便数据查询显示时直接转为中文说明。

   GetText 获得枚举值下的中文说明

   GetValue 根据中文说明获得对应的枚举值 

   QueryBuilder 查询构造器类,主要是构造查询条件,where后面的,使用方法类似StringBuilder。

   Append 追加查询条件

   BeginBracket 添加一个左括号

   EndBracket 添加一个右括号

   下面是Configuration下的几个类,主要提供连接串的存储方式

   AppConnectionConfig 连接串是存储在App.setting文件中的

   BinaryConnectionConfig 连接串是存储在bin文件里的,读或写的时候key取"a"...."h"。

   RegConnectionConfig 连接串是存储在注册表里的

   SysXmlConnectionConfig 连接串是存储在系统目录里的xml文件里的

   XmlConnectionConfig 连接串是存储在任意位置的xml文件里的

   好了,Data这个类就介绍到这里了,相关的例子在以后的文章中会给出的,下一篇介绍一下Common.Windows类库了。


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
5,636.719ms