时间:2021-07-01 10:21:17 帮助过:6人阅读
以前曾经用过Oracle+ExtJS进行项目开发,可能接触的很少,感觉和Sqlserver数据库大同小异,
就我自己而言,很多项目一般基于Ado.Net+Sqlserver2008 R2这一套(用过的Entity FrameWork实体框架(ORM)底层也是基于Ado.Net去访问数据库).
现在我自己写一个用Ado.Net访问Oracle数据库的一点点代码(还不完整,以后会补全基本的常用操作功能),我自己的思路是从简单三层一点点往抽象模式进行编写
首先定义的UserInfo是从oracle数据库映射的一个实体对象,在数据访问层中以UserInfoDal形式继承至BaseDal<T>泛型父类和一个关于对于List操作的泛型接口,
代码如下:
GetListByWhere()和GetListByWhere(string where)实现基本一致,DataReaderToList(OracleDataReader dr)和DataSetToList(DataSet ds)思路一样(ListAction<T>的东西),其中实现代码如下:
public List<UserInfo> GetListByWhere()
{
OracleConnection conn = DbAction.getConn();
string sqlStr = "select * from userinfo t";
OracleCommand com = new OracleCommand(sqlStr, conn);
conn.Open();
OracleDataReader dr = com.ExecuteReader();
List<UserInfo> list = DataReaderToList(dr);
conn.Close();
return list;
}
public List<UserInfo> DataReaderToList(OracleDataReader dr)
{
try
{
List<UserInfo> list = null;
while (dr.Read())
{
list = new List<UserInfo>();
UserInfo t = new UserInfo();
t.Fid = int.Parse(dr.GetOracleNumber(0).ToString());
t.Fname = dr.GetOracleString(1).ToString();
t.Fpassword = dr.GetOracleString(2).ToString();
list.Add(t);
}
return list;
}
catch (Exception)
{
throw;
}
finally
{
dr.Close();
}
}
其中会涉及到一个DbAction类,可以封装一些数据库连接关闭等的对象以及方法:
public static class DbAction
{
private readonly static string connString = System.Configuration.ConfigurationManager.ConnectionStrings["connString"].ToString();
public static OracleConnection getConn()
{
OracleConnection conn = new OracleConnection(connString);
return conn;
}
//.....可以继续补充
}
回归正题,正常的通用逻辑应该归于在BaseDal<T>泛型父类中进行实现
其中TableName,PrimaryKey字段属性和泛型T的实体对象,将在进行通用sql语句编程时起到作用.
BaseDal<T>实现BaseAction<T>接口的方法,并约束T在BaseModel,且允许进行new操作
实现的Delete方法代码如下:
public bool Delete(string id)
{
StringBuilder sb = new StringBuilder();
sb.AppendFormat("delete from {0} where {1}=:id",TableName,PrimaryKey);
OracleConnection conn = DbAction.getConn();
OracleCommand com = new OracleCommand(sb.ToString(), conn);
com.Parameters.Add(DbHelper.CreateParam("id", string.IsNullOrEmpty(id) ? "0" : id));
conn.Open();
int i=com.ExecuteNonQuery();
conn.Close();
if(i>0)
{
return true;
}
return false;
}
需要注意的是,在BaseModel也需要要有TableName,PrimaryKey等(以后会添加其他字段属性),并且在Model中自己定义的映射实体对象必须指定PrimaryKey