Feedback
@Ants
可以通过创建视图;
@金色海洋(jyk)
我对这个数据展现的看法是,至少翻页控件不应该是数据的原始提供者,因为翻页不仅仅是简单数据集;虽然视图可以解决一部分,但那并不是什么情况通用;并且这个存在sql拼接的问题,我认为翻页控件应该是最简单的一个事件驱动而已;数据的页应该交给业务组件来完成;
回复 引用 查看
同意楼上的,翻页控件不应该考虑数据源,仅仅实现“翻页”就足以。
回复 引用 查看
我很懒,我觉得这样挺好的。也用了三年多了,没有遇到什么问题。
有哪些情况不能满足呢?能不不能举个例子呢?
常见的分页的一种处理方式是在存储过程里面组合SQL语句,楼上的二位对这种处理方法的看法呢?能不能说一下呢?
什么样的要求,只能由业务组件来完成,分页控件(不对,应该说是视图)做不了呢?目前我还没有遇到。
回复 引用 查看
心不苦,命苦,呵呵。
我真的是不理解,分页控件为什么就不能多管点“闲事”呢?
@萧寒
哪些情况可以用呢?哪些情况不可以用呢?在一个项目中,他们的比例是多少呢?几比几,谁赢了:)
对于那些可以使用的情况,为什么不能用呢?一定要写更多的代码来实现相同的功能呢?
sql拼接有哪些问题呢?效率?SQL注入?网络传输?不能缓存执行计划?还是什么?
在存储过程里面组合SQL语句的话,也同样存在着效率、SQL注入、不能缓存执行计划的问题呀,这种方法呢?可以吗?
回复 引用 查看
突然看到老兄这样的写法是会被注入的!
还是用sp_executesql吧,很危险的
回复 引用 查看
感觉不错啊
这个分页控件,应该花了不少时间
我觉得,要做到完全通用很难,所以能达到基本要求就可以了,最主要的是数据源一定要灵活
回复 引用 查看
@金色海洋(jyk)
@@ 你的控件本身无任何问题,公说公有理,婆说婆有理,我针对你提的几个观点说点自己的想法;
哪些情况可以用呢?哪些情况不可以用呢?在一个项目中,他们的比例是多少呢?几比几,谁赢了:)
@@ 视图的列非固定的情况下不可用;控件应该是通用设计,当违背了这个原则后,就不得不考虑要满足一些特殊需求,那么这个不是几比几,是可用性,越是通用设计就越要避免实现固化需求;这只是个分页控件,它应该只是提供分页参,发起分页请求,而不参与数据逻辑;实际上分页控件有用的信息只有页大小与页索引,那sql 的配置是多余的;
对于那些可以使用的情况,为什么不能用呢?一定要写更多的代码来实现相同的功能呢?
@@ 为什么sql的配置多余的,因为你实现了这个数据源,是不是应该考虑不同的数据库的分页sql差别,如果数据来源不是数据库的话,那是不是又很鸡肋?
sql拼接有哪些问题呢?效率?SQL注入?网络传输?不能缓存执行计划?还是什么?
在存储过程里面组合SQL语句的话,也同样存在着效率、SQL注入、不能缓存执行计划的问题呀,这种方法呢?可以吗?
@@ sql拼接本身没有问题,没有 sql 拼接就不能写出灵活的数据查询,但是一个控件将sql都放到了aspx内,是不是页面代码应该直连数据库了?
@@ 当然,如果在这些方面没有要求,那么这个分页控件确实是完美的;
@@ 我认为,你的分页控件把分页的展示多做一些风格和样式,并且把配置sql的几个属性隐藏掉,那就已经很好了!
回复 引用 查看
怪我没说清楚,一会再补上一篇。
@PerfectDesign
注入是没有的,不知道您注意没有,我是用的是
this.Txt_LastName.TextTrimNone;
这种方法,而不是 this.Txt_LastName.Text;
Txt_LastName.TextTrimNone 相当于 Txt_LastName.Text.Trim().Replace(''',''); 这样就可以避免注入攻击了。
另外如果字段是数字类型的话,还要判断是不是数字,这样才更安全。
@王孟军!
确实是很长的时间,从03年开始接触asp.net的时候就开始了,当时看到前辈使用UserControl的方式来实现分页,这个只负责绘制UI,没有其他的功能。受到这个启发,才开始写分页控件的,一点一点完善。到05年基本稳定。
@萧寒
我也针对你的观点说说我的想法。
>>视图的列非固定的情况下不可用。
这个非固定是什么意思呢?动态创建的视图吗?还是没有理解。
>>控件应该是通用设计
这个我也承认,但是还有一个要求:多干点活:) 。我更注重后者,如果二者冲突的话,我会选择后者。
我不追求放之四海而皆准,我只求放之一海而简单好用,原因很简单,我可以做四种分页控件,一个海里放一个,呵呵,这样就可以都准了。
不能太追求通用,DataGrid的分页功能是最通用的,但是使用的人并不多,因为UI上不是太灵活,数据量大了有会比较慢。
>>不同的数据库的分页sql差别
这个是在考虑中的,也有了比较好的解决方案。一会细说。如果数据源不是数据库的话,那么对不起,不支持。注意:Excel属于数据库,是支持的,因为使用OleDb可以访问。XML就不支持了,好像OleDb不能访问。
>>一个控件将sql都放到了aspx内,是不是页面代码应该直连数据库了?
这个说明,我对分页控件的介绍不够详细。控件本身是.cs文件,是一个类,没有aspx呀。连接数据库是和分页控件无关的,这个是交给数据访问函数库来实现的。数据访问函数库是一个help,专门负责访问数据库的,所以页面代码直连数据库是不存在的。
>>当然,如果在这些方面没有要求,那么这个分页控件确实是完美的;
谢谢。样式可以通过 css来实现。每一个“元素”都会加上class的属性,都会有ID,这样便于设置css。“上一页”这样的文字也是可以通过属性来修改的。
看到分页控件的属性的图片了吗?里面显示了这些属性。
回复 引用 查看
@PerfectDesign
晕,sp_executesql就不注入了,现在很多分页存储也不也是拼sql的。
lz太小瞧黑客了,输入的值过滤“,”也就是阻止点看着网上教程黑别人的菜鸟而已,sql注入的手法很多的不是简简单单去掉一个,就可以搞定的,尽量减少sql拼接多用参数才是最好的办法。
回复 引用 查看
2008-06-28 08:36 |
JYK
俺支持你啦!
也支持俺师傅!
回复 引用
@kiler
请问还有哪些高级的注入方式呢?望请赐教,万分感谢!
不是为了注入别人的网站,只为加强自己的防御:)
回复 引用 查看
@ pwqzc
谢谢。好久没聊了,还炒股吗?不对好像是期票,不好意思,弄混了。
回复 引用 查看
我觉得翻页控件不应提供TableName这个的属性,不知道lz用这个属性干嘛,到控件内部中用“select * from tablename”吗?,我觉得应该是提供DataSource属性,让使用者提供个数据源。
@金色海洋(jyk)
@萧寒
多表联合查询,就建立视图?我以前的项目也是这样,但发现这样会造成
View的数量>Table数量
大部分只是仅仅为了显示出列表而来建立视图
之前我做的CommonQuery查询控件,也遇到这种问题,不过后来公司其它项目组用了NHibernate后就没有这种问题出现了
回复 引用 查看
@Sam Lin
TableName (还有其他的属性)是用来拼接SQL语句的,就是分页算法。
为什么要提供DataSource属性呢?又不是显示数据的控件,简单的传递DataSource给显示数据的控件没有什么意思吧。
我只遇到过 view的记录数 < table的记录数,因为多表关联的时候,由于数据不完整而造成的。再有就是笛卡尔乘积会造成记录数增多,这个是正常的吧。
回复 引用 查看
@kiler
不太明白我采用sp_executesql后,你的其他的注入方式,能举个例子吗?
不过海洋的穷举法是不可取的,防注入不可能依赖过滤,过滤的性能要差很远。而且你不可能不让用户不准提交delete等英文吧?
回复 引用 查看
这个控件,怎么说呢?感觉比较适合你个人自己使用.无论是UI上的设计(非指样式),还是数据的提取(好像Help类也是你自己写的吧?)都是比较具有你自己特色的.换言之,如果我们要使用你的分页控件的话,也会间接使用到你的help等东东.说句不该说的,分页控件一大堆,比你这个好的也多,不好的也很多,很难找到用你的pager的理由.
话说得可能有点过了,不过我想说就说点真实的想法出来,希望不要见怪!
不过单从技术的层面来讲,海洋兄的精神很值得学习:)
单从实用性来讲,我想没有人有比你更加深刻的体验,不然你也不会花这么多的时间和精力来完善你的pager了.
总结一条:适合自己的才是最好的:)
回复 引用 查看
楼主的数据访问组件写的有些麻烦,明明在providerName="System.Data.SqlClient" 已经指定了sql数据库,为什么还要在这里指定呢<add key="DataType" value="1"/>
建议你重新改写数据库访问组件
回复 引用 查看
我觉得你可以修改 BindFirstPage 函数,用代理或者是事件的方式(再或者使用策略模式)来获得数据源。你可以给出一个默认代理,就是你现在使用的 SQL 拼接方式。你用自己控件的时候,就是连带这个默认的代理方式一起用。而如果别人用你的控件,创建一个新的代理就可以了……
分页空间的“显示”、“绑定”和“分页方法”,基本上都是不会变化的,这部分将被封装起来。唯一变化的就是获取数据源的方式上有些不同,把它抽象化,并给出一个自己的具体实现就可以了——
回复 引用 查看
@菜菜灰
因为对providerName这个的用法还不熟,这个是SqlDataSource自动生成的。带上了,我也就没有去掉。但是我又不知道怎么读取这个属性。
@jillzhang
谢谢。
@kiler
感谢提供资料,大部分内容以前都看过了。我防止注入用了两种方式;
1、数字,如果确认要拼进SQL语句的是数字的话,那么会在拼入之前检查是不是数字,不是的话,不进行下面的程序。
2、非数字,就是字符串了。这个要去掉“'”就是单引号。因为捣蛋的都是单引号,去掉了,不论你输入的是什么,都会老老实实地括在一对单引号之内的,就是说不论输入什么都会当作字符串来处理,字符串就没有危险了吧。
3、不用sa连接数据库。
这是我的思路,不知道有没有遗漏的地方。
@Waitd Ding
感谢提出宝贵意见,我还会详细说明分页控件的原理、思路,还要加进入不少功能。
回复 引用 查看
@AfritXia
我现在好像就是这么做的。
回复 引用 查看
2008-6-30 20:10:00 /myPage/Default.aspx
RunSqlDataTable函数出现异常。
错误信息:在关键字 'with' 附近有语法错误。
'ROW_NUMBER' 不是可以识别的 函数名。
查询语句:set nocount on; with t_pager as (select myIndex = ROW_NUMBER() OVER (ORDER BY id ),* from news_class ) select * from t_pager where myIndex between 6 and 10 set nocount off;
回复 引用 查看
翻到第2页时出错:
如下:
2008-6-30 20:10:00 /myPage/Default.aspx
RunSqlDataTable函数出现异常。
错误信息:在关键字 'with' 附近有语法错误。
'ROW_NUMBER' 不是可以识别的 函数名。
查询语句:set nocount on; with t_pager as (select myIndex = ROW_NUMBER() OVER (ORDER BY id ),* from news_class ) select * from t_pager where myIndex between 6 and 10 set nocount off;
回复 引用 查看
不好意思,实在是对不起,忘记说明了,目前这个分业算法支持持SQL 2005。
我原以为使用了 VS2005的,都会把数据库也升级到 SQL 2005呢,随意就没有加上SQL 2000 的分页算法。
实在是对不住大家,今天晚上加上for SQL 2000的分页算法。请内心等待。
回复 引用 查看
实在是对不住大家,今天晚上加上for SQL 2000的分页算法。请内心等待。
----------------------------
好的!
等新的算法出来,接着测试。
回复 引用 查看
如果返回的列表数据中需要进行一些逻辑操作处理后再呈现给用户,那是不是得改下分页控件?如果有几个需要分页的地方逻辑处理都不一样,可能还挺麻烦的。
回复 引用 查看
逻辑操作处理 可以交给 GridView这样的控件来处理吧。另外分页控件采用DataTable来装载数据,也可以对DataTable来进行处理。
回复 引用 查看
用了SQL2000补丁后,第一页都不出来了,而且报错如下:
行 33:
行 34: //这个函数必须执行,而且要在给上面的属性赋值之后执行。
行 35: this.myPage1.BindFirstPage();
行 36:
行 37: }
回复 引用 查看
我用原来的BIN敷盖,第一页又好了,还是打不开第2页
问题依旧。
回复 引用 查看
1:属性:SQLKind采用TableVar
2:TableIDColumns属性 修改为ID后,正常
可是在[ ]GO 里输入页数时没有反应,而且页底显示“有网页错误”
回复 引用 查看