作者:肖波

个人博客:http://blog.csdn.net/eaglet ; http://www.cnblogs.com/eaglet

2007/7 南京


版本
CodeSmith 4.0
netTiers 2.0.1

背景
        最近在项目中使用CodeSmith + netTiers 生成数据访问层DAL,感觉效果很好,减少了大量的简单重复劳动。
不过在使用过程中发现CodeSmith提供的方法不能完全满足项目需要,主要体现在两个方面:
1、 Data.DataRepository.TableProvider.GetPaged方法无法输入带参数的条件,调用前必须进行SQL 拼接,
这样可能导致SQL 注入攻击。
2、 DataRepository.Provider.ExecuteDataSet 无法分页查询

为解决以上问题,我做了如下代码对生成的DAL进行了补充。这些代码可以在DAL外部使用,也可以修改netTiers
模板,内置到DAL中。




ParaWhereString  类用于将带参数的条件子句转换为不带参数的条件子句,供GetPaged,GetAll两个方法使用。这个类是一个通用的类,也可以用于
其他应用中获取带参数的条件子句的最终转换后的条件子句。

DataRepositoryEx 类提供分查询的方法。

ParaWhereString 调用示例
对CodeSmith + netTiers 生成DAL的一点补充            ParaWhereString paraWhereString = new ParaWhereString();
对CodeSmith + netTiers 生成DAL的一点补充
对CodeSmith + netTiers 生成DAL的一点补充            
string whereString = "price>@minPrice and price <= @maxPrice and str like '%adb''@aaa dsafj'";
对CodeSmith + netTiers 生成DAL的一点补充
对CodeSmith + netTiers 生成DAL的一点补充            List
<SqlParameter> paras = new List<SqlParameter>();
               paras.Add(new SqlParameter("minPrice", 100));
               paras.Add(new SqlParameter("MaxPrice", 1000));

对CodeSmith + netTiers 生成DAL的一点补充
对CodeSmith + netTiers 生成DAL的一点补充
对CodeSmith + netTiers 生成DAL的一点补充            String sql 
= paraWhereString.GetWhereString(whereString, paras);
对CodeSmith + netTiers 生成DAL的一点补充
对CodeSmith + netTiers 生成DAL的一点补充            Console.WriteLine(sql);
输出结果:
price>100 and price <= 1000 and str like '%adb''@aaa dsafj'

DataRepositoryEx 调用示例

用于测试的表结构

对CodeSmith + netTiers 生成DAL的一点补充use Test

   GO

对CodeSmith + netTiers 生成DAL的一点补充
Create Table Test
对CodeSmith + netTiers 生成DAL的一点补充(
对CodeSmith + netTiers 生成DAL的一点补充id 
int identity (1,1not null,
对CodeSmith + netTiers 生成DAL的一点补充
int
对CodeSmith + netTiers 生成DAL的一点补充
对CodeSmith + netTiers 生成DAL的一点补充)
对CodeSmith + netTiers 生成DAL的一点补充


向表Test中插入若干条连续的记录

查询分页数据示例

对CodeSmith + netTiers 生成DAL的一点补充
对CodeSmith + netTiers 生成DAL的一点补充        
int count;
对CodeSmith + netTiers 生成DAL的一点补充
对CodeSmith + netTiers 生成DAL的一点补充        List
<SqlParameter> paras = new List<SqlParameter>();
对CodeSmith + netTiers 生成DAL的一点补充        paras.Add(
new SqlParameter("min"3));
对CodeSmith + netTiers 生成DAL的一点补充        paras.Add(
new SqlParameter("max"30));
对CodeSmith + netTiers 生成DAL的一点补充
对CodeSmith + netTiers 生成DAL的一点补充        DataTable table 
= SecUser.Cert.BLL.DataRepositoryEx.SelectPaged("id, a""test..test""id >= @min and id < @max"
对CodeSmith + netTiers 生成DAL的一点补充            paras, 
"order by id DESC"010out count);
对CodeSmith + netTiers 生成DAL的一点补充
对CodeSmith + netTiers 生成DAL的一点补充        Response.Write(String.Format(
"Count={0}", count));
对CodeSmith + netTiers 生成DAL的一点补充
对CodeSmith + netTiers 生成DAL的一点补充        
foreach(DataRow row in table.Rows)

查询结果:

Count=27

 

29

 

28

 

27

 

26

 

25

 

24

 

23

 

22

 

21

 

20

相关文章: