前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >我的CMS开发记-3 只要是人就会犯错误,只要是软件就会有BUG,即使他是nhibernate

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

作者头像
用户1687945
发布2018-05-02 11:34:48
5580
发布2018-05-02 11:34:48
举报

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

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

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

代码语言:javascript
复制
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 关键字给吃掉了,晕,他们到底测试过没啊??改成像我这样就好了

代码语言:javascript
复制
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两个数据库下都顺利的跑起来了!庆祝一下呵呵.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2009-01-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档