Petshop的架构思路清晰简单,我想很多人都很了解,就想问些简单问题。1.一般DAL层写好或者生成好了常用的SQL语句,但是面对自定义SQL语句怎么办?
2.应该改写DAL层还是写在别的地方?
3.可以在DAL层留一个方法,然后在BLL层写自定义SQL语句和参数传进去执行吗?如DAL层留个方法:/// <summary>
/// 自定义SQL语句得到一个DataSet(包含自定义的DataTable名)
/// </summary>
public DataSet GetData(String tableName, String sql)
{
return OracleHelper.Query(tableName, sql);
}
BLL层写语句调用,虽然这个DAL层的方法显得没有意义了,但是我主要是想在数据库结构没有发生变化的时候,除了UI和BLL层,都不可以做到不去修改。
2.应该改写DAL层还是写在别的地方?
3.可以在DAL层留一个方法,然后在BLL层写自定义SQL语句和参数传进去执行吗?如DAL层留个方法:/// <summary>
/// 自定义SQL语句得到一个DataSet(包含自定义的DataTable名)
/// </summary>
public DataSet GetData(String tableName, String sql)
{
return OracleHelper.Query(tableName, sql);
}
BLL层写语句调用,虽然这个DAL层的方法显得没有意义了,但是我主要是想在数据库结构没有发生变化的时候,除了UI和BLL层,都不可以做到不去修改。
解决方案 »
- asp.net3.5入门经典和asp.net3.5揭秘哪本更适合初学者呢?
- Ajax可以返回数据,也可以alert,但是无法显示在页面
- asp.net c#如何获取到子窗体控件?可以在.cs页面获取到么?
- 关于DataList上编辑模式下的绑定正确获取值!
- 以前和程序没有问题,现在老是出现这"连接都已被使用并已达到最大池大小"
- 三天了,这个问题还没解决window.parent.document.getElementById(window.name)?(分都给完了,哪位仁兄帮个忙了)
- 生成静态网页,模板中的自定义标签(带属性)如何替换?
- 难题:自定义一个继承WebControl.Button的控件,相加一个属性控制是否Sumbit.
- 如何给datagrid中的<headerstyle>添加属性。
- 问一下两种数据库的差别
- 如何获取页面跳转前的地址
- 急,水晶报表打印
BLL只是分配调用哪个操作事件
Petshop 的 DAL 还清晰简单?烦都烦死了。Linq to SQL 才算清晰简单。DAL层一行代码也不用写,这才叫做清晰简单。
BLL中不应当传入sql语句来处理
DAL中的方法可以接收一些参数,从BLL层中调用传入以实现灵活的做sql操作
感谢回复,那就是说每扩充一个方法,还要写IDAL和DAL,当数据库结构发生变更的时候,CODESMITH就要重新生成DAL和MODEL层,这个时候还要记得那个DAL是从写过的,还要把自定义的复制出来,避免覆盖,是不是太麻烦了?既然BLL有时候都可以传where的字符串作为参数给DAL实现一些灵活操作,为什么不能直接传SQL语句和parameters呢?
[email protected]
更谈不上是错误——你的程序可以正常运行嘛
不过,如果是新人,最好不要这样写因为sql语句放在bll层是有前提的
就是你认为sql语句是什么一个方法:string f(int num,string username)
参数是num和username
其类型是int和string
同样,string f(string sqlstr)
如果你能把sqlstr理解成带有很规范格式的参数的话,你可以用
如果在你的眼睛,你觉得sql语句是且仅是一个字符串的话,哪就算了
另外,如果是多人合作开发或维护,哪也就最好不要这样同样xml,你可以看成结构严禁的特殊的txt文件,只要这些东西用活了,这里的界限其实并没有那么多规矩
我在DAL层也写了一些公用的扩展方法,就是为了BLL可以写少量代码就实现自定义语句的扩充,就是想让程序员只专注UI和BLL层。比如BLL层只用这样写就可以获取一个可以绑定且和Model中对应类型的DS:
/// <summary>
/// 得到一个扩展的对象实体
/// </summary>
public DataSet GetExtendModel(Int64 SET_DEPARTMENTLIST_ROWID)
{
//定义一个Hashtable用来存放关联的表名以及关系列(可为多表关联)
Hashtable Relationship = new Hashtable();
//用法示例
//Relationship.Add("表1 a", "列2=a.列1");
Relationship.Add("SET_DepartmentList a", "ParentRowID=a.SET_DepartmentList_RowID"); //定义一个String数组用来存放需要查询的扩展关联列(扩展出的各列均为只读,需要使用Eval绑定)
String[] Columns = new String[1];
//用法示例
//Columns[0] = "a.列5 as 别名1";
//Columns[1] = "a.列6 as 别名2";
Columns[0] = "a.DepartmentName as ParentName";
return objIDAL.GetExtendModel(SET_DEPARTMENTLIST_ROWID, Relationship, Columns);
}
对应的DAL
/// <summary>
/// 得到一个扩展的对象实体
/// </summary>
public DataSet GetExtendModel(Int64 SET_DEPARTMENTLIST_ROWID, Hashtable Relationship, String[] Columns)
{
StringBuilder strSQL = new StringBuilder();
//查询出该表下的所有列
strSQL.Append("select SET_DEPARTMENTLIST.SET_DEPARTMENTLIST_ROWID, SET_DEPARTMENTLIST.DEPARTMENTNAME, SET_DEPARTMENTLIST.PARENTROWID, SET_DEPARTMENTLIST.DEPARTMENTEXPLAIN");
//循环查询扩展关联列(带别名)
foreach (String str in Columns)
{
if (!String.IsNullOrEmpty(str))
{
strSQL.Append(", " + str);
}
} strSQL.Append(" from SET_DEPARTMENTLIST ");
//循环添加关联表及左连接关系列(带别名)
foreach (DictionaryEntry de in Relationship)
{
strSQL.Append("left join " + de.Key.ToString() + " ");
strSQL.Append("on SET_DEPARTMENTLIST." + de.Value.ToString() + " ");
}
strSQL.Append("where SET_DEPARTMENTLIST.SET_DEPARTMENTLIST_ROWID=:SET_DEPARTMENTLIST_ROWID");
OracleParameter[] parameters =
{
new OracleParameter(":SET_DEPARTMENTLIST_ROWID", OracleType.Number)
};
parameters[0].Value = SET_DEPARTMENTLIST_ROWID;
DataSet objDS = OracleHelper.Query(strSQL.ToString(), parameters);
if (objDS.Tables[0].Rows.Count > 0)
{
//克隆数据结构
DataSet objDS_Clone = objDS.Clone();
//将返回的DataSet各列数据类型转化为对应的Model数据类型
//此行为目的是借用DataSet实现实体类的功能并与实体类保持兼容
//可将此方法和实体类的操作方法配合使用在同一个ObjectDataSource中
//需要注意的是:扩展出的各列均为只读,需要使用Eval绑定
objDS_Clone.Tables[0].Columns["SET_DEPARTMENTLIST_ROWID"].DataType = Type.GetType("System.Int64");
objDS_Clone.Tables[0].Columns["DEPARTMENTNAME"].DataType = Type.GetType("System.String");
objDS_Clone.Tables[0].Columns["PARENTROWID"].DataType = Type.GetType("System.Int64");
objDS_Clone.Tables[0].Columns["DEPARTMENTEXPLAIN"].DataType = Type.GetType("System.String");
//创建一个新行实现数据类型转化
objDS_Clone.Tables[0].Rows.Add(objDS_Clone.Tables[0].NewRow()); //循环赋值,令返回的DataSet具有匹配后数据类型的数据
for (Int32 intCount = 0; intCount < objDS_Clone.Tables[0].Columns.Count; intCount++)
{
objDS_Clone.Tables[0].Rows[0][intCount] = objDS.Tables[0].Rows[0][intCount];
} return objDS_Clone;
}
else
{
return null;
}
}请各位朋友关注我的这次回复,给于解答,让我对架构的理解更加深入。同时我也觉得有很多东西值得我们思考。
何以见的呢?看:
vs2005推出了强类型的DataSet,
vs2008推出了Linq,
这些是什么东东?
数据访问层啊!!
这些东东你用过后,正像18楼所说:“petshop的写法变的更不可思议了”
楼下的拍砖吧!
各种各样的人都有啊。。