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

陪我进丛林

陪我进丛林

2016-02-19 19:32

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

  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

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

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

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

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

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

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

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

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

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

  /// 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

展开更多 50%)
分享

猜你喜欢

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

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

Access 2000教程:17.4 定义新的字段名

编程语言 网络编程
Access 2000教程:17.4 定义新的字段名

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

excel数据透视表字段名无效怎么办?

excel
excel数据透视表字段名无效怎么办?

SQL中查询数据表字段名称的查询语句

SQLServer
SQL中查询数据表字段名称的查询语句

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

如何取得一个表的所有字段名用逗号分割

SQLServer
如何取得一个表的所有字段名用逗号分割

在Excel中插入数据透视表时提示数据透视表字段名无效

计算机应用技术 excel 数据透视表
在Excel中插入数据透视表时提示数据透视表字段名无效

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

使用JMail组件代替Sql Mail发送Email 遇到的问题

使用JMail组件代替Sql Mail发送Email 遇到的问题

ASP日期和时间函数示例

ASP日期和时间函数示例
下拉加载更多内容 ↓