最新更新 sitemap 网站制作设计本站搜索
网页设计
国外网站 韩国网站 个人主页 手提袋设计 CSS 网页特效 平面设计 网站设计 Flash CMS技巧 服装网站 php教程 photoshop 画册 服务器选用 数据库 Office
虚拟主机 域名注册 云主机 网页设计 客服QQ:8208442
当前位置:首页 > 编程开发 > asp教程

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

日期:01-22    来源:中国设计秀    作者:cnwebshow.com

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

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

Debug 时可以获取其产生的 SQL 如下:Mlm中国设计秀

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];Mlm中国设计秀
我修改了一下源代码中的 SqlDataProvider.cs 里的 BuildWhere 方法,暂时解决这个问题。Mlm中国设计秀

        protected static string BuildWhere(Query qry)Mlm中国设计秀
        {Mlm中国设计秀
            string where = "";Mlm中国设计秀
            string whereOperator = " WHERE ";Mlm中国设计秀

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

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

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

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

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

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

 Mlm中国设计秀
评论Mlm中国设计秀
# re: SubSonic 的字段名未转义问题修正 2007-01-22 00:47 TerryLee Mlm中国设计秀
SubSonic还不错,号称是零代码数据访问层:)  回复  更多评论   Mlm中国设计秀

# re: SubSonic 的字段名未转义问题修正 2007-01-22 00:49 木野狐 Mlm中国设计秀
@TerryLee Mlm中国设计秀
呵呵,是的。不过我不敢用它的自动方式,毕竟感觉自己的控制少。理由就像这篇 post 所描述的一样。 Mlm中国设计秀
  回复  更多评论   Mlm中国设计秀

# re: SubSonic 的字段名未转义问题修正 2007-01-22 00:53 TerryLee Mlm中国设计秀
@木野狐 Mlm中国设计秀
嗯,没错Mlm中国设计秀

我只用它写过一个小Demo:)  回复  更多评论   Mlm中国设计秀

# re: SubSonic 的字段名未转义问题修正 2007-01-22 01:02 木野狐 Mlm中国设计秀
另外使用时感觉这个东西的文档还是少。举的例子也很简单。稍微有用一点的用法都靠我自己的摸索。 Mlm中国设计秀
比如这个: Mlm中国设计秀
要根据条件加载一个对象,文档(pdf)中提到可以用Mlm中国设计秀

对象.Load(...) 来加载,其中的参数可以是 IDataReader, DataRow, DataTable.Mlm中国设计秀

我用一个 IDataReader 传进去,结果搞了半天都是出错。最后调试到框架源代码里发现必须在传递 IDataReader 进去之前,自己 Read 一次才能成功。比如我写的这段简单例子里用到:Mlm中国设计秀

/// <summary> Mlm中国设计秀
/// 得到经办人所在科室的负责人 Mlm中国设计秀
/// </summary> Mlm中国设计秀
/// <param name="staff"></param> Mlm中国设计秀
/// <returns></returns> Mlm中国设计秀
public static Staff GetManager(Staff staff) { Mlm中国设计秀
SubSonic.Query qry = new SubSonic.Query(Staff.Schema.Name); Mlm中国设计秀
qry.AddWhere(Staff.Columns.IsFunctionary, true); Mlm中国设计秀
qry.AddWhere(Staff.Columns.OfficeId, staff.OfficeId);Mlm中国设计秀

Staff manager = new Staff(); Mlm中国设计秀
IDataReader reader = qry.ExecuteReader(); Mlm中国设计秀
if (reader.Read()) Mlm中国设计秀
{ Mlm中国设计秀
manager.Load(reader); Mlm中国设计秀
} Mlm中国设计秀
return manager; Mlm中国设计秀
}Mlm中国设计秀

http://www.cnblogs.com/RChen/archive/2007/01/22/actionpack1.htmlMlm中国设计秀

本文引用地址:/bc/article_46438.html
网站地图 | 关于我们 | 联系我们 | 网站建设 | 广告服务 | 版权声明 | 免责声明