在開發過程中,大家可能都發現,形成一套個人開發風格是相當重要,這也可以延伸為整個團隊的開發模式,甚至形成一個有形的開發框架。
我經過這一兩年的摸索,不斷的完善,現在大體形成了幾個東東,自己感覺還不錯,所以想貼出來與大家一起分享,如有需要的朋友,可以直接與我聯系。
大體有以下幾個類庫:
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裡是這樣寫到的:
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 存儲過程參數集合類,這裡面特別的有幾個方法
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>
{
}
}
上面已經提到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方法了。
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裡配置
<?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裡就可以改成
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類庫了。