AFramework程序集说明(WORD无图片)
AFramework程序集说明
FangRonghua
2009.02
3.1 ToString()方法和ToCountString()方法
1简介
文件名:AFramework.dll
命名空间:AFramework
AFramework是持久层的一种实现,封装了应用程序常用的数据库操作。运用该组件时,主要运用两个类:PersistenceManager、PersistenceManagerNServer、QueryStatement。
PersistenceManagerNServer 是在分布式环境下使用的。
调用其方法时必须指定使用哪台服务器。可配置多台服务器,可将服务器设定编号为1、2、…N。
目前存在的问题是未完全解决分布式事务管理。如果只是从多台数据库查询数据是没问题的。
PersistenceManager是对PersistenceManagerNServer中编号为1的服务器操作,即本地数据库应用服务程序。
代码生成工具目前支持的数据类型:VARCHAR2、CHAR、NUMBER、FLOAT、DATE、BLOB、LONG RAW
AFramework目前支持的类型为String、Decimal、DateTime、Byte[]
2 PersistenceManager类包含的方法
2.1 新增记录
命名空间:AFramework
类名:PersistenceManager
方法 |
Int Insert(string sql) |
名称 |
新增记录 (sql语句版) |
说明 |
创建一个新的Oralce连接,执行该sql语句,完成操作后自动提交,并关闭连接。遇到异常则抛出异常并自动回滚。 |
方法 |
Int Insert(string sql,int sessionID) |
名称 |
新增记录 (sql语句+事务版) |
说明 |
使用指定的会话连接,执行该sql语句,完成操作后不提交,不关闭连接。遇到异常则抛出异常并自动回滚。 |
方法 |
Int Insert(object model) |
名称 |
新增记录 (DataModel版) |
说明 |
创建一个新的Oralce连接,根据model插入数据,完成操作后自动提交,并关闭连接。遇到异常则抛出异常并自动回滚。 |
方法 |
Int Insert(object model, int sessionID) |
名称 |
新增记录 (DataModel+事务版) |
说明 |
使用指定的会话连接,根据model插入数据,完成操作后不提交,不关闭连接。遇到异常则抛出异常并自动回滚。 |
2.2 更新记录
命名空间:AFramework
类名:PersistenceManager
方法 |
Int Update(string sql) |
名称 |
更新记录 (sql语句版) |
说明 |
创建一个新的Oralce连接,执行该sql语句,完成操作后自动提交,并关闭连接。遇到异常则抛出异常并自动回滚。 |
方法 |
Int Update(string sql,int sessionID) |
名称 |
更新记录 (sql语句+事务版) |
说明 |
使用指定的会话连接,执行该sql语句,完成操作后不提交,不关闭连接。遇到异常则抛出异常并自动回滚。 |
方法 |
Int Update(object model, QueryStatement query) |
名称 |
更新记录 (DataModel版) |
说明 |
创建一个新的Oralce连接,根据model及query更新数据,完成操作后自动提交,并关闭连接。遇到异常则抛出异常并自动回滚。 |
方法 |
Int Update(object model, QueryStatement query, int sessionID) |
名称 |
更新记录 (DataModel+事务版) |
说明 |
使用指定的会话连接,根据model及query更新数据,完成操作后不提交,不关闭连接。遇到异常则抛出异常并自动回滚。 |
方法 |
Bool UpdateDataSet(DataSet ds,String tableName) |
名称 |
更新DataSet |
说明 |
创建一个新的Oralce连接,使用一个事务处理。更新指定表的DataSet数据,包含Insert、Update、Delete功能。 |
2.3 删除记录
命名空间:AFramework
类名:PersistenceManager
方法 |
Int Delete(string sql) |
名称 |
删除记录 (sql语句版) |
说明 |
创建一个新的Oralce连接,执行该sql语句,完成操作后自动提交,并关闭连接。遇到异常则抛出异常并自动回滚。 |
方法 |
Int Delete(string sql, int sessionID) |
名称 |
删除记录 (sql语句+事务版) |
说明 |
使用指定的会话连接,执行该sql语句,完成操作后不提交,不关闭连接。遇到异常则抛出异常并自动回滚。 |
方法 |
Int Delete(QueryStatement query) |
名称 |
删除记录 (DataModel版) |
说明 |
创建一个新的Oralce连接,根据query删除数据,完成操作后自动提交,并关闭连接。遇到异常则抛出异常并自动回滚。 |
方法 |
Int Delete(QueryStatement query, int sessionID) |
名称 |
删除记录 (DataModel+事务版) |
说明 |
使用指定的会话连接,根据query删除数据,完成操作后不提交,不关闭连接。遇到异常则抛出异常并自动回滚。 |
2.4 单值查询
命名空间:AFramework
类名:PersistenceManager
方法 |
Object GetSingleValue(string sql) |
名称 |
单值查询 (sql语句版) |
说明 |
创建一个新的Oralce连接,执行该sql语句,完成操作后自动提交,并关闭连接。遇到异常则抛出异常并自动回滚。 |
方法 |
Object GetSingleValue(string sql, int sessionID) |
名称 |
单值查询 (sql语句+事务版) |
说明 |
使用指定的会话连接,执行该sql语句,完成操作后不提交,不关闭连接。遇到异常则抛出异常并自动回滚。 |
方法 |
Object GetSingleValue(string colName,QueryStatement query) |
名称 |
单值查询 (DataModel版) |
说明 |
创建一个新的Oralce连接,根据query构造条件,查询指定字段,完成操作后自动提交,并关闭连接。遇到异常则抛出异常并自动回滚。 |
方法 |
Object GetSingleValue(string colName ,QueryStatement query, int sessionID) |
名称 |
单值查询 (DataModel+事务版) |
说明 |
使用指定的会话连接,根据query构造条件,查询指定字段,完成操作后不提交,不关闭连接。遇到异常则抛出异常并自动回滚。 |
2.5 取DataSet
命名空间:AFramework
类名:PersistenceManager
方法 |
DataSet GetDataSet(string sql) |
名称 |
取DataSet (sql语句版) |
说明 |
创建一个新的Oralce连接,执行该sql语句,完成操作后自动提交,并关闭连接。遇到异常则抛出异常并自动回滚。 |
方法 |
DataSet GetDataSet(string sql,int sessionID) |
名称 |
取DataSet (sql语句+事务版) |
说明 |
使用指定的会话连接,执行该sql语句,完成操作后不提交,不关闭连接。遇到异常则抛出异常并自动回滚。 |
方法 |
DataSet GetDataSet(QueryStatement query) |
名称 |
取DataSet (DataModel版) |
说明 |
创建一个新的Oralce连接,根据query查询数据,完成操作后自动提交,并关闭连接。遇到异常则抛出异常并自动回滚。 |
方法 |
DataSet GetDataSet(QueryStatement query, int sessionID) |
名称 |
取DataSet (DataModel+事务版) |
说明 |
使用指定的会话连接,根据query查询数据,完成操作后不提交,不关闭连接。遇到异常则抛出异常并自动回滚。 |
2.6 取序列值
命名空间:AFramework
类名:PersistenceManager
方法 |
decimal GetSequenceNextVal(string strSequenceName) |
名称 |
取序列值 |
说明 |
创建一个新的Oralce连接,完成操作后关闭连接。遇到异常则抛出异常。 |
方法 |
decimal GetSequenceNextVal(string strSequenceName,int sessionId) |
名称 |
取序列值 |
说明 |
使用指定的会话连接,完成操作后不提交,不关闭连接。遇到异常则抛出异常。 |
2.7 取实体对象
命名空间:AFramework
类名:PersistenceManager
方法 |
object GetObject(QueryStatement query) |
名称 |
取实体对象 |
说明 |
创建一个新的Oralce连接,完成操作后关闭连接。遇到异常则抛出异常。无相应实体时返回null |
方法 |
object GetObject(QueryStatement query, int sessionId) |
名称 |
取实体对象 |
说明 |
使用指定的会话连接,根据query查询。遇到异常则抛出异常。无相应实体时返回null |
方法 |
object GetObjects(QueryStatement query) |
名称 |
取实体对象数组 |
说明 |
创建一个新的Oralce连接,完成操作后关闭连接。遇到异常则抛出异常并自动回滚。无相应实体时返回null |
方法 |
object GetObject(QueryStatement query, int sessionId) |
名称 |
取实体对象数组 |
说明 |
使用指定的会话连接,根据query查询。遇到异常则抛出异常并自动回滚。无相应实体时返回null |
2.8 事务管理
命名空间:AFramework
类名:PersistenceManager
方法 |
Int SessionOpenSession() |
名称 |
创建并打开会话 |
说明 |
连接Oracle,创建并打开会话。创建成功则返回SessioinID,在事务管理时用到该ID,以标识该会话。创建失败抛出异常。 |
方法 |
bool SessionBeginTransaction(int sessionID) |
名称 |
开启指定会话的事务 |
说明 |
开启成功,返回true;若失败,抛出异常。 |
方法 |
bool SessionCommitTransaction(int sessionID) |
名称 |
提交指定会话的事务 |
说明 |
提交成功,返回true;若失败,抛出异常。 |
方法 |
bool SessionRollbackTransaction(int sessionID) |
名称 |
回滚指定会话的事务 |
说明 |
回滚成功,返回true;若失败,返回false。不抛出异常。调用一次即可。 服务器端操作数据发生异常时自动回滚。客户端调用本方法时与服务器自动回滚不会冲突。 |
方法 |
bool SessionCloseSession(int sessionID) |
名称 |
关闭会话 |
说明 |
关闭成功,返回true;若失败,返回false。不抛出异常。调用一次即可。 |
2.9 调用存储过程
方法 |
String ExeStoredProcedure(string procedureName,OracleParameter[] pars) |
名称 |
执行存储过程 |
说明 |
若需要返回值则需要在parameters中定义一个Direction为Output或InputOutput类型的参数,该参数必须为字符串类型。 若parameters长度为0,则认为无输入输出参数,只调用该存储过程。 执行过程出错将抛出异常。 |
2.10 Remoting设置
方法 |
void SetRemotingServerIP(string ip) |
名称 |
设置Remoting服务器IP地址 |
说明 |
如:127.0.0.1 |
方法 |
void SetRemotingServerPort(string port) |
名称 |
设置Remoting服务器的服务端口 |
说明 |
如:6868 本设计支持Tcp、Http通道传输。若采用Http可设置为80。 |
方法 |
void SetRemotingServerChannelType(string HttpOrTcp) |
名称 |
设置Remoting服务器的服务类型 |
说明 |
支持Tcp、Http通道传输。建议采用Tcp通道,效率高。 输入的值为“Tcp”或者“Http” |
3 QueryStatement类所包含的方法
该类的设计思想来源与面向对象的要求。根据实践经验,直接写SQL语句比由Filter、OrderBy等方法构造出where条件来得更直接。调试程序时用到以下两个方法就可以了。
3.1 ToString()方法和ToCountString()方法
方法 |
string ToString() |
名称 |
取查询语句 |
说明 |
返回的字符串格式为select 字段名1、字段名2 from 表名 where … 实体对象赋值的字段均作为条件。若实体对象未赋值则无where条件。 |
方法 |
string ToCountString() |
名称 |
返回统计记录数语句 |
说明 |
返回的字符串格式为select count(*) from 表名 where … 实体对象赋值的字段均作为条件。若实体对象未赋值则无where条件。 |
4 代码示例
可参看程序:AFW示例代码
4.1 新增数据
//新增数据 DataModel版 建议使用
//分两步
//第一步:构造新增数据的model
AFW_Test_Three three = new AFW_Test_Three();
//three.ID3 = id; //由触发器生成
three.COL4 = "这是字段4";
three.COL5 = "这是字段5";
//第二不:执行操作
//用PersistenceManager类操作数据库时务必捕捉异常 以下不再作注释
try
{
PersistenceManager.Insert(three);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
//新增数据 sql语句版
string sql = "INSERT INTO AFW_Test_Three(COL4,COL5) VALUES('这是字段4','这是字段5')";
try
{
PersistenceManager.Insert(sql);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
4.2 更新数据
//更新数据 DataModel版 建议使用
//分三步
//第一步:需要更新的字段均赋值给model
AFW_Test_Three model = new AFW_Test_Three();
model.COL4 = "字段4更新后的内容";
model.COL5 = "字段4更新后的内容";
//第二步:构造更新条件
AFW_Test_Three where = new AFW_Test_Three();
where.ID3 = 2609;
QueryStatement query = new QueryStatement(where);
//可查看更新条件
Console.WriteLine(query.GetWhereAndFilter());
//第三步:执行操作
try
{
PersistenceManager.Update(model, query);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
////sql语句版的略
AFW_Test_Four four = new AFW_Test_Four();
four.COL2 = "字段2";
//four.COL3 = 3;
//four.COL4 = System.DateTime.Now;
//byte[]赋值示例 将文件保存至数据库
FileStream fs = new FileStream("C:\\1.bmp", FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
byte[] photo = br.ReadBytes((int)fs.Length);
four.COL5 = photo;
AFW_Test_Four w = new AFW_Test_Four();
w.ID1 = 2642;
QueryStatement q = new QueryStatement(w);
try
{
PersistenceManager.Update(four, q);
}
catch (Exception ex2)
{
MessageBox.Show(ex2.Message);
}
4.3 删除数据
//删除数据 DataModel版 分两步
//第一步:构造删除条件
AFW_Test_Three where = new AFW_Test_Three();
where.ID3 = 2609;
QueryStatement query = new QueryStatement(where);
//第二步:执行操作
try
{
PersistenceManager.Delete(query);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
//sql语句版的更简捷 建议使用
//直接写sql语句
4.4 单值查询
//取单值 DataModel版
//分两步
//第一步:构造条件
AFW_Test_Three where = new AFW_Test_Three();
where.ID3 = 2610;
QueryStatement query = new QueryStatement(where);
//第二步:执行操作
try
{
object obj = PersistenceManager.GetSingleValue("col4",query); //返回数据的第一行第一列
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
//sql语句版的更简捷 建议使用
string sql = "SELECT COUNT(*) FROM TAB";
try
{
object obj = PersistenceManager.GetSingleValue(sql); //返回数据的第一行第一列
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
4.5 取DataSet
//取DataSet DataModel版
//取全部数据 等效sql语句:SELECT col1,col2,...,coln from AFW_Test_Three
AFW_Test_Three model = new AFW_Test_Three();
//model.ID1 = 101; //若对字段赋值 将作为where条件
QueryStatement query = new QueryStatement(model);
try
{
DataSet ds = PersistenceManager.GetDataSet(query);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
//sql语句 略
4.6 取序列值
//序列值
try
{
decimal dec = PersistenceManager.GetSequenceNextVal("AFW_TEST_TWO_seq");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
//若只是取出一个序列值 赋给记录 此时可以不共享会话 这样操作比较简便 如:
try
{
decimal dec = PersistenceManager.GetSequenceNextVal("AFW_TEST_TWO_seq");
AFW_Test_Three model = new AFW_Test_Three();
model.ID3 = dec;
PersistenceManager.Insert(model);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
4.7取实体对象
//取实体对象
AFW_Test_Four model = new AFW_Test_Four();
model.ID1 = 2639; //最多只能有一条记录
QueryStatement query = new QueryStatement(model);
object obj = PersistenceManager.GetObject(query);
if (obj != null) //无记录时返回null
{
AFW_Test_Four m = (AFW_Test_Four)obj;
Console.WriteLine(m.ID1.ToString());
}
//取实体对象数组
AFW_Test_Four model = new AFW_Test_Four();
QueryStatement query = new QueryStatement(model);
object[] objArray = PersistenceManager.GetObjects(query); //无记录时返回null
AFW_Test_Four[] modelArray = new AFW_Test_Four[objArray.Length];
for (int i = 0; i < modelArray.Length; i++)
{
modelArray[i] = (AFW_Test_Four)objArray[i];
}
for(int i=0; i < modelArray.Length;i++)
{
Console.WriteLine(modelArray[i].ID1.ToString());
}
4.8 调用存储过程
//调存储过程
//无任何参数
OracleParameter[] p = new OracleParameter[0];
try
{
string str = PersistenceManager.ExeStoredProcedure("proc_afw_test3", p);
Console.WriteLine("调存储过程 无参数 ok");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
//仅有输出参数
//OracleParameter[] p = new OracleParameter[1];
p = new OracleParameter[1];
p[0] = new OracleParameter();
p[0].ParameterName = "result";
p[0].OracleType = OracleType.VarChar;
p[0].Direction = ParameterDirection.Output;
p[0].Size = 2000;
try
{
string str = PersistenceManager.ExeStoredProcedure("proc_afw_test1", p);
Console.WriteLine("调存储过程 仅有输出参数 ok");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
//仅有入参数 有输入输出参数的情况 差不多
//OracleParameter[] p = new OracleParameter[4];
p = new OracleParameter[4];
p[0] = new OracleParameter();
p[0].ParameterName = "contract_id";
p[0].OracleType = OracleType.VarChar;
p[0].Direction = ParameterDirection.Input;
p[0].Value = "00";
p[1] = new OracleParameter();
p[1].ParameterName = "contractor_name";
p[1].OracleType = OracleType.VarChar;
p[1].Direction = ParameterDirection.Input;
p[1].Value = "11";
p[2] = new OracleParameter();
p[2].ParameterName = "epscode";
p[2].OracleType = OracleType.VarChar;
p[2].Direction = ParameterDirection.Input;
p[2].Value = "22";
p[3] = new OracleParameter();
p[3].ParameterName = "result";
p[3].OracleType = OracleType.VarChar;
p[3].Direction = ParameterDirection.Output;
p[3].Size = 2000;
try
{
string str = PersistenceManager.ExeStoredProcedure("proc_afw_test2", p);
Console.WriteLine("调存储过程 ok");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
4.9 同一数据库的事务操作
int sessionID = 0;
try
{
sessionID = PersistenceManager.SessionOpenSession();
PersistenceManager.SessionBeginTransaction(sessionID);
AFW_Test_One one = new AFW_Test_One();
//ID1值要赋给表二、表三,所以不由触发器生成。
one.ID1 = PersistenceManager.GetSequenceNextVal("AFW_TEST_ONE_seq",sessionID);
one.COL2 = "这是字段2";
one.COL3 = "这是字段3";
one.COL4 = "这是字段4";
PersistenceManager.Insert(one, sessionID);
AFW_Test_Two two = new AFW_Test_Two();
two.ID2 = PersistenceManager.GetSequenceNextVal("AFW_TEST_TWO_seq",sessionID);
two.ID1 = one.ID1;
two.COL3 = "这是字段3";
two.COL4 = "这是字段4";
PersistenceManager.Insert(two, sessionID);
AFW_Test_Three three = new AFW_Test_Three();
//three.ID3 = id; //由触发器生成
three.ID1 = one.ID1;
three.ID2 = two.ID2;
three.COL4 = "这是字段4";
PersistenceManager.Insert(three, sessionID);
PersistenceManager.SessionCommitTransaction(sessionID);
PersistenceManager.SessionCloseSession(sessionID);
Console.WriteLine("新增数据成功!");
}
catch (Exception ex)
{
PersistenceManager.SessionRollbackTransaction(sessionID);
Console.WriteLine("新增数据失败 " + ex.Message);
}
4.10 分布式数据库的事务操作
//PersistenceManager即为编号1应用服务器地址
//PersistenceManager.SetRemotingServerIP("10.164.72.164");
//PersistenceManager.SetRemotingServerPort("6969");
//PersistenceManager.SetRemotingServerChannelType("Tcp");
PersistenceManagerNServer.SetRemotingServerIP(2, "10.164.72.163");
PersistenceManagerNServer.SetRemotingServerPort(2, "6969");
PersistenceManagerNServer.SetRemotingServerChannelType(2, "Tcp");
int sessionID1 = 0;
int sessionID2 = 0;
try
{
sessionID1 = PersistenceManager.SessionOpenSession();
sessionID2 = PersistenceManagerNServer.SessionOpenSession(2);
PersistenceManager.SessionBeginTransaction(sessionID1);
PersistenceManagerNServer.SessionBeginTransaction(2, sessionID2);
AFW_Test_One one = new AFW_Test_One();
//ID1值要赋给表二、表三,所以不由触发器生成。
one.ID1 = PersistenceManager.GetSequenceNextVal("AFW_TEST_ONE_seq",sessionID1);
one.COL2 = "这是字段2";
one.COL3 = "这是字段3";
one.COL4 = "这是字段4";
PersistenceManager.Insert(one, sessionID1);
PersistenceManagerNServer.Insert(2, one, sessionID2);
AFW_Test_Two two = new AFW_Test_Two();
two.ID2 = PersistenceManager.GetSequenceNextVal("AFW_TEST_TWO_seq",sessionID1);
two.ID1 = one.ID1;
two.COL3 = "这是字段3";
two.COL4 = "这是字段4";
PersistenceManager.Insert(two, sessionID1);
PersistenceManagerNServer.Insert(2, two, sessionID2);
AFW_Test_Three three = new AFW_Test_Three();
//three.ID3 = id; //由触发器生成
three.ID1 = one.ID1;
three.ID2 = two.ID2;
three.COL4 = "这是字段4";
PersistenceManager.Insert(three, sessionID1);
PersistenceManagerNServer.Insert(2, three, sessionID2);
//--------------
//目前这样有问题 不能保证都提交
//尝试用COM+协调封装但没测试成功
//根据二阶段提交协议算法 到时会改
//对于只是从其它服务器取数据回来再处理 这样做完全可以满足要求了
//从其它服务器取数据时 可以不开事务
PersistenceManager.SessionCommitTransaction(sessionID1);
PersistenceManagerNServer.SessionCommitTransaction(2,sessionID2);
//--------------
PersistenceManager.SessionCloseSession(sessionID1);
PersistenceManagerNServer.SessionCloseSession(2, sessionID2);
}
catch (Exception ex)
{
PersistenceManager.SessionRollbackTransaction(sessionID1);
PersistenceManagerNServer.SessionRollbackTransaction(2, sessionID2);
Console.WriteLine(ex.Message);
}
4.11 存图片
AFW_Test_Four four = new AFW_Test_Four();
four.COL2 = "字段2";
//byte[]赋值示例 将文件保存至数据库
FileStream fs = new FileStream("C:\\1.bmp", FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
byte[] photo = br.ReadBytes((int)fs.Length);
four.COL5 = photo;
try
{
PersistenceManager.Insert(four);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
4.12 取图片
//sql版
string sql = "select COL5 from AFW_Test_Four where id1=2670";
try
{
DataSet ds = PersistenceManager.GetDataSet(sql);
byte[] b = (byte[])ds.Tables[0].Rows[0]["COL5"];
FileStream fs = new FileStream("D:\\2.bmp", FileMode.OpenOrCreate);
fs.Write(b, 0, b.Length);
fs.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
//object版
AFW_Test_Four model = new AFW_Test_Four();
model.ID1 = 2670;
QueryStatement query = new QueryStatement(model);
try
{
AFW_Test_Four four = (AFW_Test_Four)PersistenceManager.GetObject(query);
if (four != null)
{
byte[] b = four.COL5;
FileStream fs = new FileStream("D:\\3.bmp", FileMode.OpenOrCreate);
fs.Write(b, 0, b.Length);
fs.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
联系方式:QQ652182937
End