SubSonic 的字段名未转义问题修正
来源:互联网 发布:汽车修理软件哪个好 编辑:程序博客网 时间:2024/05/02 04:18
SubSonic 是集代码生成 / Build Provider (asp.net 2.0 的新特性) 于一身的一个非常不错的数据访问框架。其灵感来自 ROR 里的 ActionPack. 非常适合于小型网站的快速开发。
昨天我开始使用这个框架,发现了一个小问题。
我有一个字段名为 Key,在生成一个 Select 语句的查询时 sql 报错。因为 Key 是一个关键字,而 SubSonic 产生的 SQL 中对此未作转义处理。
Debug 时可以获取其产生的 SQL 如下:
我修改了一下源代码中的 SqlDataProvider.cs 里的 BuildWhere 方法,暂时解决这个问题。
我增加的部分在上面代码中标注为绿色。
很奇怪,作者对表名加了方括弧,却没有加给列名,这样显然就不严谨了。
这个库中还有 MySqlDataProvider 等类也有此问题。因为我现在暂时不用 MySQL, 就先不去改那些了。
另外有一个体会就是使用开源的第三方类库时,尽量都用源代码方式加入到项目中来。否则出错了调试不进去。
现在,我使用这个框架的方法是利用它的生成类的那个网页 GenerateAllClasses.aspx 做代码生成,然后自己引用进来。虽然比默认的直接生成后在内存中编译运行要麻烦一点,但是这样便于 Debug. 还是很值得的。
昨天我开始使用这个框架,发现了一个小问题。
我有一个字段名为 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;
}
{
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. 还是很值得的。
- SubSonic 的字段名未转义问题修正
- 关于未名湖边的烦恼问题
- 未名湖边的烦恼问题
- [原创]修正SubSonic v2.2.1的一处BUG,以及如何使用SubSonic进行多表查询、子查询以及数据库分页
- 未名的祝福
- 未名湖边的烦恼引起的递归问题探讨
- 关于mysql的表名/字段名/字段值是否区分大小写的问题
- 合唱队问题的修正
- SubSonic的配置方法
- Subsonic的配置方法
- Subsonic的复杂查询
- SQL SERVER 2008不能修改表的解决方法(增加字段、修改字段名)(未解决)
- 修正RO6.0.43中Oracle取字段长度不正确的问题.
- PostgreSQL中表名、字段名大小写问题
- PostgreSQL中表名、字段名大小写问题
- PostgreSQL中表名、字段名大小写问题
- subsonic
- ibatis中字段名问题
- Django 中如何给 User 增加额外的 Profile 信息
- Django 中自定义 tag 如何获取变量参数的值
- Django文档翻译:模型参考(Model Reference)
- 开始学习 limodou 的 Django step by step 了
- Karrigell 初次学习
- SubSonic 的字段名未转义问题修正
- Django 学习纪要(1) 模版语法
- 注意 JavaScript 中 RegExp 对象的 test 方法
- CodeProject 文章收藏 (2007-1-3)
- Error while trying to run project: Unable to start debugging 绑定句柄无效
- 关注一下 IronPython Community Edition
- 前面是什么?
- 扩展 IronPython for ASP.NET:编写自定义属性注入器
- Anthem.NET 的 "BAD RESPONSE" 问题的脚本调试技巧小结