日期:2014-05-17  浏览次数:20949 次

C#出个自认为非常繁琐问题,大家看如何解答!(公式分母为0判断,并得出SQL语句的字符串)
大家都知道如果SQL查询中出现分母为0(零),查询就会出错,因此,如何判断查询公式分母是否为0,特别是复杂的公式判断,并形成SQL判断语句,例如:
给出公式:(DSFGS + GWER)/SDFFWE+GWEDD 和数据表 A

C#得出这样字符串:(这个公式C#判断语句还是比较简单)
SLECT DATE, CASE WHEN SDFFWE=0 THEN 0 ELSE (DSFGS + GWER)/SDFFWE+GWEDD END AS '利用效率' FROM A 



如果是比较复杂的公式呢?(公式字段不规则)
如:(DSFGS + GWER)/SDFFWE/(GWEDD-TWEDF/FSETQQD)
    (SDF-YTUFD)/SDFWE + SDF/(GDG+REWR)
........
    C#如何判断,只要有分母,都能判断,最后给出SQL语句字符串。。。。

------解决方案--------------------
这个应该能够实现,只要你足够细心
我以前写过表达式解析,过程十分痛苦。下面的算法不一定正确:
1.先定义SQL语句中能够出现的所有运算符、函数和括号,初期可以简单些,例如仅有+ - * / ( )放入一个集合。
2.遍历SQL字符串,根据上面的运算符集合将字符串生成  变量、运算符集合(去掉空格)
3.对这个集合进行分析:
5.为了简化优先级问题,对于A*B和A/B可以变成(A*B)和(A/B)方法是,便利变量、运算符集合,遇到*或/则对其左侧的变量前加"(",右侧的加")".A*A/B变为((A*A)/B)
4.从后往前寻找"(",找到最内侧的"("
5.从"("开始往后寻找")"得到最优先的一端表达式,可知这段表达式仅有可看作同一运算级别运算符。
6 对/有侧为变量的,把变量提取出来。右侧为"("的,把左右括号间的部分提取出来(这里应该还有一段小算法)
7 提取出来的东西都是需要判断是否为0的部分

------解决方案--------------------
公式自然是用户定义的,不然怎么会如此麻烦,直接写就好。
给你写一段吧

            //这个字符串就是客户自己输入的公式
            string set_str = "a+b/(a-b)";
            //将实际数值代替公式变量a=6 ,b=4,如果都是6就会出现除0异常
            set_str = set_str.Replace("a", "6");
            set_str = set_str.Replace("b", "4");

            DataTable formula = new DataTable();
            decimal result = Convert.ToDecimal( formula.Compute(set_str, ""));
            MessageBox.Show(result.ToString());

------解决方案--------------------
http://bbs.csdn.net/topics/100114738