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

2016-02-19 19:32 3 1 收藏

下面图老师小编要跟大家分享SubSonic 的字段名未转义问题修正,简单的过程中其实暗藏玄机,还是要细心学习,喜欢还请记得收藏哦!

【 tulaoshi.com - Web开发 】

  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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

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

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

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

  我只用它写过一个小Demo:)  回复  更多评论   

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

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

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

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

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

  Staff manager = new Staff();
  IDataReader reader = qry.ExecuteReader();
  if (reader.Read())
  {
  manager.Load(reader);
  }
  return manager;
  }

  http://www.cnblogs.com/RChen/archive/2007/01/22/actionpack1.html

来源:http://www.tulaoshi.com/n/20160219/1621247.html

延伸阅读
转义字符   所有的转义字符都是由 '' 打头的   第二个字符       0-9  :八进制       u    :是Unicode转意,长度固定为6位       Other:则为以下字母中的一个 b,t,n,f,r,",   &nbs...
标签: Web开发
我们知道,IE6可能过不了多久就会消失了,但是我们还能继续支持这个浏览器并且避免hack和有约束的CSS吗?这里是10个使用有效的HTML和CSS代码来修正IE6主要问题的方法。 1. 使用DOCTYPE 你应该在一直每个HTML文件的头部都使用DOCTYPE,并且我们推荐使用strict 版本,比如: 1 !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN&qu...
问题:MySQL 5.0不能使用自动增加字段。 具体原因: 引起的原因是在MySQL5.0.2版本中的The Server SQL Mode 中新加了几种 sql_mode,并且在sql的my.ini文件中的sql-mode 默认增加了其中的二种,一个是STRICT_TRANS_TABLES,就是导致auto_increament失败的mode,这个sql_mode主要用于当一个值不能插入到表中是,则产生一个错误而不是...
如何解决win7程序未响应的问题   首先,打开开始菜单,打开所有程序,进入附件,点击运行。 其次,打开运行在里面输入regedit运行注册表后点击确定。 接着,依次展开到HKEY_CURRENT_USERControl PanelDesktop,然后在空白处单击右键,新建一个DWORD 32位值。 最后,重命名为 WaitToKillAppTimeout后双击文件...
解决win7音频服务未运行问题   1、点击周末左下角windows图标,选择控制面板选项,如下图所示: 2、进入控制面板后,把查看方式更改成大图标,找到管理工具图标,如下图所示: 3、打开服务界面后,右键点击Windows Audio服务,选择重新启动选项,如下图所示: 正常情况下完成以上操作就能解决win7音频服...

经验教程

73

收藏

73
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部