我的CMS开发记-3 只要是人就会犯错误,只要是软件就会有BUG,即使他是nhibernate

      nhibernate1.2支持access数据库。但是我一直在用sqlserver开发。现在已经有了一点样子,于是我心血来潮,将数据库切换为Access,看看执行的效果如何。

      碰,出错了。Sql语句语法错误。我靠,果然有错误,改改,再试?还是出错。郁闷了。打断点开始调试,确定我的代码没有错。我没错那谁错了?nhibernate??不会吧?不过事已至此,又不可能重新写,只好硬着头皮上了,呵呵。将nhibernate的引用移除,直接引用nhibernate的源码开始调试,没想到啊没想到,居然还真的被我给找出bug来了。

     nhibernate处理access时,使用的是jetdriver这个方言。由于access的特殊性(sql语句做连接时,必须要用括号),于是在jetdriver里,对sql语句进行了处理。代码在此:jetdriver.cs的96行处有这么一段

private SqlString FinalizeJoins(SqlString sqlString)
        {
            if (_queryCache.Contains(sqlString))
            {
                return (SqlString) _queryCache[sqlString];
            }
            // fix wxy 
            int beginOfFrom = sqlString.IndexOfCaseInsensitive(" from ");
            int endOfFrom = sqlString.IndexOfCaseInsensitive(" where ");

            if (beginOfFrom < 0)
            {
                return sqlString;
            }

            if (endOfFrom < 0)
            {
                endOfFrom = sqlString.Length;
            }

            string fromClause = sqlString.Substring(beginOfFrom, endOfFrom - beginOfFrom).ToString();

            string transformedFrom = TransformFromClause(fromClause);

            //put it all together again
            SqlStringBuilder final = new SqlStringBuilder(sqlString.Count + 1);
            final.Add(sqlString.Substring(0, beginOfFrom));
            final.Add(transformedFrom);
            final.Add(sqlString.Substring(endOfFrom));

            SqlString ret = final.ToSqlString();
            _queryCache[sqlString] = ret;

            return ret;
        }

这段的代码的意思呢,是取出from后面的部分,以对join语句进行access语法的特别加工。原来bug就在这里,

他在查找关键字时,是按照"from","where"这两个,但是,from,where这两个词必须要在头尾加上空格才能保证不会和其他单词混淆。原文是没有空格的。这个好像也算是低级错误呀,呵呵,测试不仔细!BS一下再说

     改成我这样写的,再试,OK!这个问题没了。没高兴一会,碰!又出错了。再一跟,OMG, jetdriver.cs里的bug还真不少,又来一个:132行处,返回的字符串居然把 from 关键字给吃掉了,晕,他们到底测试过没啊??改成像我这样就好了

private string TransformFromClause(string fromClause)
        {
            string transformed;

            //"from ".Length
            const int fromLength = 5;
            fromClause = fromClause.Substring(fromLength, fromClause.Length - fromLength);
            string[] blocks = fromClause.Split(',');
            if (blocks.Length > 1)
            {
                for (int i = 0; i < blocks.Length; i++)
                {
                    string tr = TransformJoinBlock(blocks[i]);
                    if (tr.IndexOf(" join ") > -1)
                    {
                        blocks[i] = "(select * from " + tr + ") as jetJoinAlias" + i.ToString();
                    }
                    else
                    {
                        blocks[i] = tr;
                    }
                }
                // wxy fixed
                transformed = " from " + string.Join(",", blocks);
            }
            else
            {
                transformed = " from " + TransformJoinBlock(blocks[0]);
            }

            return transformed;
        }

OK!,一切顺利,我的系统在sql,access两个数据库下都顺利的跑起来了!庆祝一下呵呵.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏GIS讲堂

Arcgis for Android解决中文字体乱码的问题

首先,在此感谢Arcgis for Android群里的一位成员,大家可以加进来QQ群号:337469080。

1554
来自专栏Java技术分享

基于Metronic的Bootstrap开发框架经验总结(3)--下拉列表Select2插件的使用

在上篇《基于Metronic的Bootstrap开发框架经验总结(2)--列表分页处理和插件JSTree的使用》介绍了数据的分页处理,使用了Bootstrap ...

3868
来自专栏圣杰的专栏

Asp.net mvc 知多少(三)

本系列主要翻译自《ASP.NET MVC Interview Questions and Answers 》- By Shailendra Chauhan,想...

2126
来自专栏互联网开发者交流社区

Robots协议

1647
来自专栏IMWeb前端团队

React函数式进阶

React让很多人让追捧的一个特性是它的所有的组件都是完全由JavaScript组成的。组件的定义是JavaScript,组件的模板也可以是JavaScript...

2356
来自专栏张戈的专栏

移动搜索SEO:网站移动适配之Meta标注、移动跳转终结篇

这些天,在给博客的标签页(tag)添加跳转和 META 动态申明时,居然让我醍醐灌顶,发现之前的动态适配的做法是多么的苦逼和小白! 总结前,先来回顾下小白张戈在...

5066
来自专栏landv

办公用品管理系统VB——库存数量导出EXCEL,SaveEXCEL

总体来说,VB的EXCEL导出效率还是蛮低的,就是一个小型化的办公用品管理软件,不再优化了。

2032
来自专栏老司机的简书

老司机带你走进Core Animation 之CADisplayLink

今天说点啥呢?上次老司机说过,带你走进CoreAnimation,那今天就趁热打铁,继续讲讲核心动画相关的东西吧。那今天要讲的就是CADisplayLink。

1182
来自专栏GIS讲堂

web中的树形结构【小结】

最近在做一个项目,是一个b/s架构的,在项目中,用到了树形结构,即如图1所示的结构。

2782
来自专栏微信终端开发团队的专栏

iOS微信特殊字符保护方案

一般来说,特殊字符闪退是系统漏洞引起,只要更新系统就行。但大部分用户不愿意更新系统...

81314

扫码关注云+社区

领取腾讯云代金券