趁着五一放假,来写几篇文章,因为最近实在实在是太忙了。
在开发过程中,大家可能都发现,形成一套个人开发风格是相当重要,这也可以延伸为整个团队的开发模式,甚至形成一个有形的开发框架。
我经过这一两年的摸索,不断的完善,现在大体形成了几个东东,自己感觉还不错,所以想贴出来与大家一起分享,如有需要的朋友,可以直接与我联系。
大体有以下几个类库:
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里是这样写到的:
Code
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
}
这样,每一个类就好维护了,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
Code
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>
{
}
}
上面已经提到DataModelList这个类了,实际就是一个List<T>泛型,其中提供了几个方法:
Sort 按指定的字段名进行排序。
Select 根据给定的条件查询出子集合,类似于DataTable.Select。
Compute 根据给定的条件及计算求和或平均等。
Group 对字段进行分组。
如:
Code
TB_BUY_BILL_DA da = new 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(2009, 4, 29));
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
Code
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方法了。
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里配置
Code
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<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里就可以改成
Code
using System;
using FaibClass.Data;
using FaibClass.Data.Configuration;
namespace 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