趁着五一放假,来写几篇文章,因为最近实在实在是太忙了。

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

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

    大体有以下几个类库:

    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 关闭更新开关

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

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

 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
}

    这样,每一个类就好维护了,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

 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>
    {
    }
}

 

    上面已经提到DataModelList这个类了,实际就是一个List<T>泛型,其中提供了几个方法:
    Sort 按指定的字段名进行排序。
    Select 根据给定的条件查询出子集合,类似于DataTable.Select。
    Compute 根据给定的条件及计算求和或平均等。
    Group 对字段进行分组。
    如:


 TB_BUY_BILL_DA();
            DateTime d = DateTime.Now;
            TB_BUY_BILLs list 
= da.Select();
            QueryBuilder qb 
= new QueryBuilder(true);
            qb.Append(QueryRelation.And, QueryCompare.Greater, TB_BUY_BILL._BUY_TIME, 
new DateTime(2009429));
            qb.Append(QueryRelation.And, QueryCompare.Equal, TB_BUY_BILL._BILL_STATE, 
true);
            
//查询子集合
            TB_BUY_BILLs list1 = list.Select(qb);
            
//排序
            list1.Sort(TB_BUY_BILL._SALED_AMOUNT);
            dataGridView1.DataSource 
= list1;
            ComputeExpression[] counts 
= new ComputeExpression[]{
                
new ComputeExpression(TB_BUY_BILL._SALED_AMOUNT, ComputeType.Max)
            };
            
//计算最大值
            list.Compute(counts, qb);
            Console.WriteLine(counts[
0].Result);
            
//分组
            DataGroupCollection dg = list.Group(TB_BUY_BILL._BILL_TYPE);
            counts[
0].ComputeType = ComputeType.Sum;
            
foreach (DataGroup group in dg)
            {
                counts[
0].Result = 0;
                Console.WriteLine(group.Value);
                group.List.Compute(counts, 
null);
                Console.WriteLine(counts[
0].Result);
            }

    BaseDataAccess 数据操作类,这里面就整合了一些发新建实体、修改实体等方法。
    Create 新建实体
    Update 更新实体,共4种重载
    Delete 删除实体
    DeleteBy 删除多个实体
    Get 获得实体,共7种重载
    IsExitst 判别实体是否存在,共4种重载
    Select 查询实体集,共9种重载

    NewEntity 新实体
    PageArgs 分页参数

    相关的例子TB_BUY_BILL_DA.cs

 

 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方法了。

    EnumTextAttribute 枚举说明特性类,主要是添加在枚举上的,方便数据查询显示时直接转为中文说明。
    GetText 获得枚举值下的中文说明
    GetValue 根据中文说明获得对应的枚举值 

    QueryBuilder 查询构造器类,主要是构造查询条件,where后面的,使用方法类似StringBuilder。
    Append 追加查询条件
    BeginBracket 添加一个左括号
    EndBracket 添加一个右括号

    下面是Configuration下的几个类,主要提供连接串的存储方式
    AppConnectionConfig 连接串是存储在App.setting文件中的
    BinaryConnectionConfig 连接串是存储在bin文件里的,读或写的时候key取"a"...."h"。
    RegConnectionConfig 连接串是存储在注册表里的
    SysXmlConnectionConfig 连接串是存储在系统目录里的xml文件里的
    XmlConnectionConfig 连接串是存储在任意位置的xml文件里的
    ConfigurationCreator 从配置文件里创建实例,这里相关的类还有:实例创建配置节-InstanceSettingsSection、实例创建配置集合-InstanceSettingsCollection、实例创建配置元素-InstanceSettings
    它的工作过程如下:首先在在app.config里配置


  <configSections>
    
<section name="faibclass.data.instanceSection" type="FaibClass.Data.Configuration.InstanceSettingsSection, FaibClass.Data2" />
  
</configSections>
  
<faibclass.data.instanceSection>
    
<faibclass.data.instanceSettings defaultInstance="Access">
      
<!-- 使用连接串 -->
      
<add name="SqlServer" type="FaibClass.Data.SqlServer, FaibClass.Data2" connectionString="Data Source=.;Initial Catalog=CAITTM_BuyLine;User ID=sa" />
      
<!-- Access -->
      
<add name="Access" type="FaibClass.Data.OleDb, FaibClass.Data2" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source={APP}\test.mdb" />
      
<!-- 使用Bin配置文件 -->
      
<add name="Sql2005" type="FaibClass.Data.SqlServer, FaibClass.Data2" interfaceType="FaibClass.Data.Configuration.BinaryConnectionConfig, FaibClass.Data2" interfaceParameters="{APP}\Connection.bin" interfaceKey="c" />
    
</faibclass.data.instanceSettings>
  
</faibclass.data.instanceSection>
</configuration>

    这样,DA里就可以改成
 Test
{
    /// <summary>
    
/// DA操作类
    
/// </summary>
    public class TB_BUY_BILL_DA : BaseDataAccess<TB_BUY_BILL, TB_BUY_BILLs>
    {
        
public TB_BUY_BILL_DA() : base (ConfigurationCreator.CreateInstance())
        {
        }
    }
}

    好了,Data这个类就介绍到这里了,相关的例子在以后的文章中会给出的,下一篇介绍一下Common.Windows类库了。
    http://www.cnblogs.com/faib/archive/2009/05/02/1447783.html

相关文章: