2012年11月18日 星期日

[除錯] 轉換 expression 到資料型別 smalldatetime 時發生算術溢位錯誤


---Error Message----
1.INSERT INTO SQL SERVER時引發錯誤,SQL資料類型 smalldatetime
將 varchar 資料類型轉換成 smalldatetime 資料類型時,產生超出範圍的值

2.
轉換 expression 到資料型別 smalldatetime 時發生算術溢位錯誤
轉換 nvarchar 到資料型別 smalldatetime 時發生算術溢位錯誤
,etc...




資料庫欄位型態為 datetime or smalldatetime
程式 insert 時,必須注意日期規則是否溢位

Ex:
一月份最大日期為31日
此時 insert 32 便會 error


解決辦法(1)--  
其實用 ISDate() 最準 
接受輸入格式 
(1)12-24 (自動加入今年)
(2)12-01-01 ,  2013-1-1,
(3)2011/1/1 ,  2012/01/12
(4)12/1-01 


在 insert 前判別規則
ex: 正規化表示法
If Not Regex.IsMatch(C.Text.Trim, "^((19|20)?[0-9]{2}[- /.](0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01]))*$") Then
   'do something
End



解決辦法(2)--
將資料庫 欄位型態 改為 varchar / nvarchar


溢位是因為期中有NULL值或空白值 

解決辦法(3)--
WHERE下條件
where date <> "" and date is not null 或是 where isdate(date)

NOTE:
一、IsDate() 有效日期的範圍是介於西元 100 年 1 月 1 日與西元 9999 年 12 月 31 日之間;其有效範圍會因作業系統而有所差異。

二、
smalldatetime 有效時間範圍 1900/1/1~2079/6/6
datetime 有效時間範圍 1753/1/1~9999/12/31
所以如果不用到太遠的日期範圍,就會使用smalldatetime。
更關鍵的差別,smalldatetime只精準到分,而datetime可精準到3.33毫秒。





參考1
參考2
參考3




沒有留言:

張貼留言