项目错误列表之四

 

    这个是一个值得庆贺的时刻——终于,我又可以在上班时间写博客了。

    这个项目从跟客户谈需求、文档、编码、测试、发布,全部由我主导。虽然,开发期间至少有一半时间加班至2点,但我还是挺高兴的,收获颇丰。趁着用户测试的一段空闲,整理项目中遇到的一些BUG和一些技巧。

    1. JS中进行正则校验

function (value){
           
var  pattern =/^ ( -? d + )(.d + ) ? $ / ;
           
if ( ! pattern.exec(value)) {
                     alert(
' 格式不正确,请输入数字 ' );
                     
return ;
          }
}

     2. 存储过程中,动态SQL拼接的问题

    2.1 动态sql与参数拼接

declare      @sqlStr      nvarchar ( 4000 )     --  主语句
--
 ....

--  datatime
set   @sqlStr   =   @sqlStr   +   '  where e1.now_date between  '''   +    convert ( varchar @startTime , 110 +   '''  and  '''   +   convert ( varchar @endTime , 110 +   ''''

--  int
if   @userCode   !=   ''
        
set   @sqlStr   =   @sqlStr   +   '  and e3.code= '   +   @userCode
--  nvarchar
else
        
begin  
                
if   @region   !=   ''
                        
set   @sqlStr   =   @sqlStr   +   '  and e3.region=N '''   +   @region   +   ''''
                
if   @depCode   !=   ''
                        
set   @sqlStr   =   @sqlStr   +   '  and e3.depcode=N '''   +   @depCode    +   ''''
                
if   @cnName   !=   ''
                        
set   @sqlStr   =   @sqlStr   +   '  and e3.cnname like N '' % '   +   @cnName   +   ' % '''
        
end

    程序传进来的@startTime与@endTime是两个字符串,而在拼接动态SQL时,需要在字符串外加两个单引号——SQL中单引号转义为“''”(连续两个单引号)。

    2.2 执行动态SQL得到的查询结果保存到局部临时表,记录会被清空

    当我们在拼接的动态SQL中,使用如此方法保存结果集“select ...... into #temp from ...... where ...... ”,然后接着在存储过程中检索这个临时表,怎么都得到不到查询结果。为此,我特意将@sqlStr输出一下(print),然后将print出来的语句在查询分析器中执行,却能得到结果。太奇怪了!我将整个存储过程的定义拷到查询分析器中,一段段执行,结果还是这样,#temp根本放不住东西。

    而当我不使用动态拼接的SQL,即直接执行select ...... into #temp from ...... where ......,又能得到结果。可问题是,添加where条件时,我有一些逻辑判断,这样直接写死无法实现这个需求。而只能拼接@sqlStr。

    后来在网上搜到了一点东西 —— 存储过程中,临时表分局部和全局两种,select ...... into ......得到的是局部临时表,执行:“print @sqlStr  exec   (@sqlStr) ”得到的结果,会在你没被用到之前释放掉。因此,不论是否能查询到结果,#temp都会是空的。局部的不行,那就只有使用全局的了。在前面定义一张临时表create table #temp (.......),然后执行:“print @sqlStr  insert #countStatic exec   (@sqlStr) ”,顺利检索到结果。

    2.3 求比率时,被除数为零

    使用case ... when ... then ... else:

select   ( case  ( sum (e1.travel_time)  +   sum (e1.waitforctm_time))  when   0   then   1   else  ( sum (e1.travel_time)  +   sum (e1.waitforctm_time))  end as  total_time  from  ...  where  ....

当被除数为0时,改为1;否则为本身(一半当你求所占比率时,如果被除数为0,这个时候除数一般也为0,如此不至于出现统计错误的情况)。

    2.4 别被as(可省略)所蒙蔽了

    取别名,是写SQL时,常用的做法:

select   travel_time  as  TravelTime , train_time  as  TrainTime  into  # temp

    在操作#temp表格时,字段名千万别用TravelTime,会报找不到这个字段的错误。输出这个表格,就可以看到原因了。as作为别名,只会在当前显示结果时,起作用,甚至你在都不能这样操作:

select   travel_time  as  TravelTime , train_time  as  TrainTime, (TravelTime / TrainTime)  as  TT   into  # temp

    2.5 当你需要在查询时,将两个字段拼接起来,而一个字段是varchar类型,另一个字段是datatime类型,你需要先对datatime字段进行转型操作:e2.customer_name + ' ,' + convert(char,e1.nowdate,102)

    3. 保存至数据库前,必须的清理工作(处理特殊字符) :

    3.1 当保存的数据中带单引号时

    这是一个最容易发生问题的错误,因为我们在拼接SQL时(哦?你说,你从来不做拼接SQL这种低级做法,好吧!跳过这段),对于字符串类型,常常在外边添加单引号,而如果你的内容中包含了单引号,那么问题来了。“'附近有语法错误”,没错,这将是你得到的Exception。写一个方法吧!在拼接之前进行转义的操作:

//  处理字符串中可能存在“'”与“"”
public   static   string  ToASCII( string  value)
{
            value 
=  value.Replace( " ' " " '' " );
            value 
=  value.Replace( " " " " "" " );

            
return  value;
}

    4. 一些有点小用途的方法,你可以将它们添加到工具类中,这回让你的代码减少不少冗余

//  获取今日日期(格式:2008-1-2)
public   static   string  GetNowDate()
{
        
return  Convert.ToDateTime(DateTime.Now.ToString()).ToString( " yyyy-MM-dd " );
}

//  小数末尾去0
public   static   string  ToInteger( string  intStr)
{
        
string [] str  =  intStr.Split( ' . ' );
        
if  (str.Length  >   1 )
        {
                
while  (str[ 1 ].EndsWith( " 0 " ))
                {
                        
if  (str[ 1 ].Length  >   1 )
                                str[
1 =  str[ 1 ].Substring( 0 , str[ 1 ].Length  -   1 );
                        
else   if  (str[ 1 ].Equals( " 0 " ))
                                
return  str[ 0 ];
                }
                
return  str[ 0 +   " . "   +  str[ 1 ];
        }
        
return  intStr;
}

//  检测日期格式是否合法
public   static   bool  CheckDate( string  date)
{
        
//  null
         if  (date  ==   null   ||  date.Trim().Length  <=   0 )
                
return   false ;

        
try
        {
                Convert.ToDateTime(date);
                
return   true ;
        }
        
catch  (System.Exception ex)
        {
                
return   false ;
        }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值