【牛腩】总结
知識點一:
using?(cmd = new?SqlCommand("insert into category(name) values('@caName')",GetConn()))
注意這個沒有分奧,然后和if 語句一樣,當滿足條件的時候,運行代碼塊中的內容。
?
?
知識點二:
建表注意事項:
對于建表大家都不陌生,這里主要說明一下幾點注意實現:
1、大數據字段最好剝離出單獨的表,以便影響性能
2、使用varchar,代替char,這是因為varchar會動態分配長度,char指定為20,即時你存儲字符“1”,它依然是20的長度?
3、給表建立主鍵,看到好多表沒主鍵,這在查詢和索引定義上將有一定的影響
4、避免表字段運行為null,如果不知道添加什么值,建議設置默認值,特別int類型,比如默認值為0,在索引查詢上,效率立顯。
5、建立索引,聚集索引則意味著數據的物理存儲順序,最好在唯一的,非空的字段上建立,其它索引也不是越多越好,索引在查詢上優勢顯著,在頻繁更新數據的字段上建立聚集索引,后果很嚴重,插入更新相當忙。
6、組合索引和單索引的建立,要考慮查詢實際和具體模式.
SQL語句注意事項:
熟悉SQL的人,都會寫SQL語句,但到底效率如何,十萬以下的數據量,根本沒任何區別,但一些基礎性的東西,還是得點滴做起
1、where語句的書寫,當有多個查詢條件時,sql是按照從右往左的順序進行執行,也就是說寫在最后的條件會最早被執行,這就意味著過濾數據量最多的
添加應該寫在最后,這樣才能在性能上達到最優
2、join語句,如果A表1000w,B表30條記錄,則應該是A join B,sql執行會以B為準去關聯A,性能顯著
3、表變量和臨時表 ,這個問題可能有些同學稍陌生,所謂表變量就是declare @dd? table類似這樣的聲明,而臨時表多見#tt,這樣的格式這二者在sql內是區別對待的表變量功能有限,使用完自動釋放,臨時表計劃就是有數據表的大部分功能,使用完畢后需要刪除,在數據庫tempdb也有對應的操作記錄,使用時應該綜合考慮。
4、注意聚合函數,is null,<>等的使用,當我們在這樣使用的時候,可能習以為常,在大數據量處理上,本有的索引將不再被使用,而變成全表掃描,So ga等吧,性能大大的慢,如where? len(studentId)=0,本來在studentid上的索引變成全表掃描了。
5、使用exist代替not in,這個大家都知道,但還是希望大家注意下
6、select AA,BB,代替Select * ,這是大部分程序員的通病,總覺得無所謂,其實select * 在sql執行時還是要遍歷到具體的字段名進行讀取,即使我們要使用全部列,也推薦使用把各個字段都羅列處理,而非使用*
7、top n 和order by 你了解多少?我一直覺得where條件查詢完后order by在此基礎上進行排序,其實錯了,在有top n和order by一塊使用時,order by竟然是全表掃描,具體可以通過查詢計劃驗證。
8、編碼過程和單元測試過程盡量用數據量較大的數據庫測試,最好能用實際數據測試
9、不要頻繁更新有觸發器的表的數據
?
知識點三:
在SQL SERVER 2008中,有三種類型的觸發器:
知識三:觸發器
實例
代碼什么的,時間一久,就對面不識了;但是?那些能夠給人眼前一亮的技能呀,真是一學就會。牛腩系統就是溜。
小技巧們:
1.? if()?然后小碎步走起,雙擊tab,就自動補全了。
?2.?自定義方法,要想顯示特有的注釋,怎么破???
注釋方法:
///summary? ?序言注釋?
?模塊注釋:
# region??
# end region
類注釋:?再懶些可以創建模板。每次新建的時候,使用模板就好了。
/*
*
*
*/
3. // TODO
4.? 代碼塊復用
?
?
錯誤:
ERROR 1:
解決方法:
ERROR 2 :
從 varchar 數據類型到 datetime 數據類型的轉換產生一個超出范圍的值
不僅是日期小于1753-01-01會報錯,日期不對也會報錯
?
| datetime | 1753-01-01到9999-12-31 00:00:00 到 23:59:59.997? | 毫秒 |
| smalldatetime | 1900-01-01 到 2079-06-06 00:00:00 到 23:59:59 | 分鐘 |
| date | ?0001-01-01 到 9999-12-31 | 天 |
| time | 00:00:00.0000000 到 23:59:59.9999999? | ?100 納秒 |
| datetime | 2 0001-01-01 到 9999-12-31 00:00:00 到 23:59:59.9999999 | 100 納秒 |
| datetimeoffset | ?0001-01-01 到 9999-12-31 00:00:00 到 23:59:59.9999999 -14:00 到 +14:00 | 100 納秒 |
?
ERROR 3
raiserror
RAISERROR?(50005,?--?Message?id.
???????????10,????--?Severity,
???????????1,?????--?State,
???????????N'abcde');?--?First?argument?supplies?the?string.
?
EEROR 4
?try-catch -finally
結論:
1、不管有木有出現異常,finally塊中代碼都會執行;
2、當try和catch中有return時,finally仍然會執行;
3、finally是在return后面的表達式運算后執行的(此時并沒有返回運算后的值,而是先把要返回的值保存起來,管finally中的代碼怎么樣,返回的值都不會改變,任然是之前保存的值),所以函數返回值是在finally執行前確定的;
4、finally中最好不要包含return,否則程序會提前退出,返回值不是try或catch中保存的返回值。
舉例:
情況1:try{} catch(){}finally{} return;
??????????? 顯然程序按順序執行。
情況2:try{ return; }catch(){} finally{} return;
????????? 程序執行try塊中return之前(包括return語句中的表達式運算)代碼;
???????? 再執行finally塊,最后執行try中return;
???????? finally塊之后的語句return,因為程序在try中已經return所以不再執行。
情況3:try{ } catch(){return;} finally{} return;
???????? 程序先執行try,如果遇到異常執行catch塊,
???????? 有異常:則執行catch中return之前(包括return語句中的表達式運算)代碼,再執行finally語句中全部代碼,
?????????????????????最后執行catch塊中return. finally之后也就是4處的代碼不再執行。
?? ? ??? 無異常:執行完try再finally再return.
情況4:try{ return; }catch(){} finally{return;}
????????? 程序執行try塊中return之前(包括return語句中的表達式運算)代碼;
????????? 再執行finally塊,因為finally塊中有return所以提前退出。
情況5:try{} catch(){return;}finally{return;}
????????? 程序執行catch塊中return之前(包括return語句中的表達式運算)代碼;
????????? 再執行finally塊,因為finally塊中有return所以提前退出。
情況6:try{ return;}catch(){return;} finally{return;}
????????? 程序執行try塊中return之前(包括return語句中的表達式運算)代碼;
????????? 有異常:執行catch塊中return之前(包括return語句中的表達式運算)代碼;
???????????????????????則再執行finally塊,因為finally塊中有return所以提前退出。
? ? ? ??? 無異常:則再執行finally塊,因為finally塊中有return所以提前退出。
最終結論:任何執行try 或者catch中的return語句之前,都會先執行finally語句,如果finally存在的話。
??????????????????如果finally中有return語句,那么程序就return了,所以finally中的return是一定會被return的,
??????????????????編譯器把finally中的return實現為一個warning。
?
總結
- 上一篇: Servlet中的Response(HT
- 下一篇: 关键词研究策略