在SqlServer 2000中datetime 的空值即默認(rèn)值為1900-01-01 00:00:00,C#中DateTime的空值是最小值0001-01-01 00:00:00,對(duì)于數(shù)據(jù)庫(kù)的插入,更新為空值的日期值來(lái)說(shuō)多少有點(diǎn)不如人所愿。比如說(shuō)我插入的是空值我取出的也要是空值,但SqlServer偏偏給了我一個(gè)默認(rèn)值。有點(diǎn)無(wú)奈。對(duì)于如何協(xié)調(diào)二者,給我?guī)?lái)了不少麻煩。
引起這樣的原因是:DateTime和Int,Double一樣都是值類型,必須有一個(gè)值。
解決的辦法:
1.從數(shù)據(jù)庫(kù)的角度:把該字段的類型改為自定義的字符串型,該字符串格式為日期樣式。這種辦法比較簡(jiǎn)單,其實(shí)就是字符串型,插入時(shí)對(duì)插入的字符串做日期的正則判斷。
2.這種方法是從網(wǎng)上搜索出于:http://treexyz.spaces./blog/cns!6667864a1ffeabc7!300.entry
對(duì)數(shù)據(jù)類型null的處理
當(dāng)C#與SQL Server數(shù)據(jù)類型定義不一致時(shí)需要怎么處理呢?
例如一個(gè)DateTime,當(dāng)DB中該字段可以為空時(shí),要求它既能用C#的DateTime賦值,又可以賦SQL Server的null值。
我采用的解決方法是,在Model對(duì)應(yīng)的類中,將該字段對(duì)應(yīng)的property的數(shù)據(jù)類型設(shè)為object。
賦值時(shí),判斷,若是空值則賦給DBNull.Value。
取值時(shí),判斷,若取到DBNull.Value則顯示null,否則要進(jìn)行一次數(shù)據(jù)轉(zhuǎn)換。這是為了DA在對(duì)DB操作時(shí),若將此字段作為參數(shù),只需要將get到的值直接賦給salParameter即可。(若model的get不轉(zhuǎn)換,則DA中要判斷是否要轉(zhuǎn)換。
因?yàn)镃#的DBNull和DateTime均可賦給sqlDBType.DateTime;反之,sql中取到的空值是以DBNUll.Value出現(xiàn)的,不能賦給C#的DateTime。
Forum有一個(gè)很大的特點(diǎn),就是在調(diào)用DB.cs的方法時(shí),參數(shù)的類型幾乎都是object。在sp中再仔細(xì)定義各參數(shù)的格式,由sql自己轉(zhuǎn)換。對(duì)于可空的參數(shù),在sp中定義=null即可。Forum傳一個(gè)null參數(shù)的情況很多,總是在接收方去判斷參數(shù),有些參數(shù)是null寫入數(shù)據(jù)庫(kù)的;但是有些參數(shù)如果為null是有其它意義的,需要條件分支代碼去處理。而我習(xí)慣于參數(shù)首先初始化,如果有不同情況共用同一個(gè)方法則增加一個(gè)參數(shù)用于判斷。我認(rèn)為使參數(shù)為null也有實(shí)際意義不是很好的辦法,因?yàn)闀?huì)造成一些不明意義的條件分支,對(duì)以后的升級(jí)和維護(hù)造成潛在的危險(xiǎn)。
3.如下語(yǔ)句能實(shí)現(xiàn)插入:
insert into Employees (lastname,firstname,hiredate) values ('hu','shuai',null),
insert into Employees (lastname,firstname,hiredate) values ('hu','shuaishuai','')
有著明顯不同的結(jié)果。可以在Sql 語(yǔ)句上實(shí)現(xiàn)。但在程序中,特別是面向?qū)ο蟮某绦蛟O(shè)計(jì)中,在加上三層架構(gòu)的一些問(wèn)題。實(shí)現(xiàn)起來(lái)頗為不便。所以我正在努力尋找一種方法巧妙的實(shí)現(xiàn)之,也希望大家給點(diǎn)建議。