程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 項目錯誤列表之四

項目錯誤列表之四

編輯:.NET實例教程

    這個是一個值得慶賀的時刻——終於,我又可以在上班時間寫博客了。

    這個項目從跟客戶談需求、文檔、編碼、測試、發布,全部由我主導。雖然,開發期間至少有一半時間加班至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;
        }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved