####原始框架
服务器和客户端C++开发,桌面版客户端,每次都要配置多个服务器,每个模块一个服务器
####修改
一个主服务器+多个计算服务器,所有客户端连接主服务器,主服务连接各个计算服务器,主服务器管理一些基础数据,计算服务器管理自己模块。可扩展、易配置
####数据库
SQLite、Access、SQLServer
Command类调用管理类
DataAccess统一管理 管理类 适配器模式
管理类全部继承DBOperateBase类(把BaseSQL和DataBase联系起来)
DBSQLite 继承IDatabase
SQLiteSQL 继承至BaseSQL
public DBOperateBase(IDataBase database, BaseSQL baseSQL)
{
m_database = database;
m_baseSQL = baseSQL;
}
public class ClassManager : DBOperateBase
{
public ClassManager(IDataBase database, BaseSQL baseSQL, UInt32 nProjectID, UInt32 nPartID)
: base(database, baseSQL)
{
SetProjectID(nProjectID);
SetPartID(nPartID);
}
}
public interface IDataBase
{
/// <summary>
/// 数据库类型
/// </summary>
/// <returns></returns>
DBType GetDBType();
/// <summary>
/// 执行SQL语句返回记录集
/// </summary>
/// <param name="sqlString">SQL语句</param>
/// <returns>数据集</returns>
DataSet GetDataSet(string strSQL);
/// <summary>
/// 执行SQL语句返回记录读取器
/// </summary>
/// <param name="strSQL"></param>
/// <returns></returns>
DbDataReader ExecuteReader(string strSQL);
/// <summary>
/// 执行SQL语句
/// </summary>
/// <param name="strSQL"></param>
/// <returns></returns>
int ExecuteNonQuery(string strSQL);
/// <summary>
/// 执行SQL返回首行首列
/// </summary>
/// <param name="strSQL"></param>
/// <returns></returns>
int ExecuteScalar(string strSQL);
/// <summary>
/// 关闭数据库
/// </summary>
void Close();
/// <summary>
/// 插入记录
/// </summary>
/// <param name="rs">记录</param>
/// <param name="bQueryID">是否返回插入后ID</param>
/// <returns></returns>
object InsertRecord(DBRecordset rs, bool bQueryID = false);
/// <summary>
/// 更新记录
/// </summary>
/// <param name="rs">记录</param>
/// <param name="strCondition">查询条件</param>
void UpdateRecord(DBRecordset rs, string strCondition);
/// <summary>
/// 创建表
/// </summary>
/// <param name="table"></param>
void CreateTable(DBTable table);
/// <summary>
/// 删除表
/// </summary>
/// <param name="strTable">表名</param>
void DropTable(string strTable);
/// <summary>
/// 创建索引
/// </summary>
void CreateIndex(string strTable, string strFields, string strIndexName = null);
void CreateUniqueIndex(string strTable, string strFields, string strIndexName = null);
/// <summary>
/// 开始事务
/// </summary>
void BeginTrans();
/// <summary>
/// 提交事务
/// </summary>
void CommitTrans();
/// <summary>
/// 回滚事务
/// </summary>
void RollbackTrans();
/// <summary>
/// 获取数据库表名列表
/// </summary>
/// <returns></returns>
List<string> GetTableNameList();
/// <summary>
/// 获取表字段名列表
/// </summary>
/// <param name="strTableName">表名</param>
/// <returns></returns>
List<string> GetTableFieldNameList(string strTableName);
/// <summary>
/// 取得字段最大ID
/// </summary>
/// <param name="strFieldName">字段</param>
/// <param name="strTableName">表名</param>
/// <returns></returns>
UInt32 GetMaxID(string strFieldName, string strTableName);
/// <summary>
/// 表是否存在
/// </summary>
/// <param name="strTableName">表名</param>
/// <returns></returns>
bool IsTableExisted(string strTableName);
/// <summary>
/// 字段是否存在
/// </summary>
/// <param name="strTableName">表名</param>
/// <param name="strField">字段名</param>
/// <returns></returns>
bool IsFieldExisted(string strTableName, string strFieldName);
}
####ServerBase包
服务器继承ServerBase的AsyncServer服务器 读取配置, 启动,监听,
CmmSever重写 DoCommnd,进入到CommandHandler
New 一下 DataAccess,每一个构造函数会读取全局下的变量,选择对应的数据库ID
(哪一个数据库不仅仅是哪一种数据库,同时可以兼容多个数据库),ID在Packet传过来
frmServer==>CmmServer:AsyncServer==>CommandHandler(解析包并输出包)==>Command
####BaseLib包
public DBSQLServer(DBConfig config)
{
string strConn = "Data Source=" + config.Server + ";Password=" + config.Password + ";User ID=" + config.User + ";Initial Catalog=" + config.DBName;
try
{
m_Conn = new SqlConnection(strConn);
m_Conn.Open();
}
catch (Exception e)
{
throw new Exception("数据库链接错误:" + e.Message);
}
}