Linux中国  设为主页
 收藏本站
 
当前位置: > 首页 ->编程语言 ->ASP ->SubSonic 的字段名未转义问题修正
  相关分类: 
ASP
ViualBasic
UML / Rational Rose
PHP4/PHP5
Perl
JAVA/JSP教程
Delphi
ColdFusion
CGI
C/C++
ASP.NET
XML
  站内搜索: 
热门文章排行
热门文章排行 ADO连接数据库字符串大全(04-23)
Asp教程:Response对象(04-23)
网站安全之ASP程序加密/解密方法大揭(04-23)
ASP函数库(05-31)
基于ASP的站内多值搜索(04-24)
精采文章排行
精采文章排行 从本质上看网页(asp,jsp)的编写(06-01)
学以致用 驳“ASP低能论” (06-01)
用VB构建Internet的应用(06-01)
Asp的安全管理(12)(06-01)
Windows 2000 安全性技术概述--3(06-01)
  ·学以致用 驳“ASP低能论” ·用VB构建Internet的应用·Asp的安全管理(12)·Windows 2000 安全性技术概述--3·Windows 2000 安全性技术概述--2·Windows 2000 安全性技术概述--1·ActiveX技术综述(二) ·ActiveX技术综述(一) ·动态网页技术--CGI:ASP:JSP:PHP(4)

SubSonic 的字段名未转义问题修正

作者:Webmaster   来源:Linuxdby.com   点击:   日期:2007-05-31 [收藏] [投稿]

  IE是否经常中毒?推荐您

SubSonic 是集代码生成 / Build Provider (asp.net 2.0 的新特性) 于一身的一个非常不错的数据访问框架。其灵感来自 ROR 里的 ActionPack. 非常适合于小型网站的快速开发。
昨天我开始使用这个框架,发现了一个小问题。

我有一个字段名为 Key,在生成一个 Select 语句的查询时 sql 报错。因为 Key 是一个关键字,而 SubSonic 产生的 SQL 中对此未作转义处理。

Debug 时可以获取其产生的 SQL 如下:

SELECT TOP 100 PERCENT  [cfg_Tips].[Id], [cfg_Tips].[Key], [cfg_Tips].[Descr], [cfg_Tips].[Value], [cfg_Tips].[Labels] FROM [cfg_Tips] WHERE [cfg_Tips].Key  =  @Key ORDER BY [Id];
我修改了一下源代码中的 SqlDataProvider.cs 里的 BuildWhere 方法,暂时解决这个问题。

        protected static string BuildWhere(Query qry)
        {
            string where = "";
            string whereOperator = " WHERE ";

            foreach (Where wWhere in qry.wheres)
            {
                if (wWhere.ParameterValue != DBNull.Value)
                {
                    where += whereOperator + "[" + wWhere.TableName + "].[" + wWhere.ColumnName + "] " +
                             Where.GetComparisonOperator(wWhere.Comparison) + " @" + wWhere.ParameterName;
                }
                else
                {
                    where += whereOperator + "[" + wWhere.TableName + "].[" + wWhere.ColumnName + "] " + Comparison.Is +
                             " NULL";
                }
                whereOperator = " AND ";
            }

            foreach (BetweenAnd between in qry.betweens)
            {
                where += whereOperator + "[" + between.TableName + "].[" + between.ColumnName + "] BETWEEN @start" +
                         between.ColumnName + " AND @end" + between.ColumnName;
                whereOperator = " AND ";
            }

            for (int i = qry.wheres.Count - 1; i >= 0; i--)
            {
                if (qry.wheres[i].ParameterValue == DBNull.Value)
                {
                    qry.wheres.RemoveAt(i);
                }
            }
            return where;
        }
我增加的部分在上面代码中标注为绿色。
很奇怪,作者对表名加了方括弧,却没有加给列名,这样显然就不严谨了。

这个库中还有 MySqlDataProvider 等类也有此问题。因为我现在暂时不用 MySQL, 就先不去改那些了。

另外有一个体会就是使用开源的第三方类库时,尽量都用源代码方式加入到项目中来。否则出错了调试不进去。
现在,我使用这个框架的方法是利用它的生成类的那个网页 GenerateAllClasses.aspx 做代码生成,然后自己引用进来。虽然比默认的直接生成后在内存中编译运行要麻烦一点,但是这样便于 Debug. 还是很值得的。

posted on 2007-01-22 00:28 木野狐 阅读(62) 评论(4)  编辑 收藏 引用 网摘 所属分类: .NET

 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<

上一页12 下一页

上一篇:输出到html页面的字符串的格式化   下一篇:ASP函数库
文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论

   相关文章:
·从本质上看网页(asp,jsp)的编写

   文章评论:(1条)
  
 请留名: 匿名评论   点击查看所有评论 论坛讨论
 

 声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。