|
.Net正式版中的一些Bug及其解決方案 (原創(chuàng)) 作者: 飛刀 (1)Session的問題
問題:
在我的Windows.Net 3604 + .Net Framework正式版的編程環(huán)境中,.Net下的Session總是有問題,比如我在A程序下設(shè)置了一個(gè)Session字典,這個(gè)Session將會(huì)在B程序下讀取,現(xiàn)在的情況就是我在B程序讀取這個(gè)Session時(shí),第一次能夠正常讀取,但一旦頁(yè)面被提交(這在Asp.Net編程中是常有的事情),Session就會(huì)馬上消失,錯(cuò)誤報(bào)告“Object is null”,使用Trace發(fā)現(xiàn)此Session已經(jīng)不存在。
此問題排除瀏覽器不支持Cookie的可能,因?yàn)槲易x取Cookie是正常的。
解決方法:
使用Session的CookieLess狀態(tài),具體操作即更改web.config或machine.config文件,這樣Session的傳值是在URL中進(jìn)行的。 使用Cookie,Cookie是可以正常使用的,只要瀏覽器沒有關(guān)閉此功能。 (2)FindControl方法的問題
問題:
大家都知道所有控件集合都存在有一個(gè)FindControl方法,一般最常用的地方就是DataGrid對(duì)Item中控件的操作。這是一個(gè)很好用的方法,可以讓我們迅速地找到我們想要的控件,但是他也是我遇到過的最不穩(wěn)定的方法。
在Item中使用這個(gè)方法,一般不會(huì)出現(xiàn)什么問題,但是在DataGrid、DataList的各種事件中這個(gè)方法經(jīng)常是找不到控件!DataGrid還好一點(diǎn),DataList的事件中發(fā)生的情況就慘不忍睹,100%的找不到控件!這個(gè)控件是活生生存在的,使用Controls集合中是可以發(fā)現(xiàn)這個(gè)控件的。這個(gè)問題我在Beta2下就已經(jīng)發(fā)現(xiàn)了,原以為微軟會(huì)在正式版本中更正,不知道是沒有人提出呢?還是沒有發(fā)現(xiàn),正式版中依然這樣。
開始我以為FindControl這個(gè)方法沒有寫好,我就自個(gè)重寫了這個(gè)方法,但是當(dāng)我高興地去用我自個(gè)寫的方法時(shí),發(fā)現(xiàn)傳回來的值還是null!!!現(xiàn)在也就只有一個(gè)解釋了,那就是.Net環(huán)境中對(duì)Control類型的支持還是不穩(wěn)定的。
解決方法:
即然通過編寫方法傳回值的方法搞不定,那么就只有用最原始的方法,在本函數(shù)內(nèi),直接列舉Controls集合中的控件,直到找到這個(gè)控件為止。
private void ShowQuestion_ItemDataBound(object sender, System.Web.UI.WebControls.DataListItemEventArgs e) { //當(dāng)返回值為Control類型,經(jīng)常出現(xiàn)空值
foreach(Control cl in e.Item.Controls) { if(cl.ClientID.IndexOf("OptionalTd1") != -1 || cl.ClientID.IndexOf("OptionalTd2") != -1) { foreach(Control clx in cl.Controls) { if(clx.ClientID.IndexOf("Oplbl1") != -1 || clx.ClientID.IndexOf("Oplbl2") != -1) { if(((Label)clx).Text == "") { ((HtmlTableCell)cl).InnerHtml = ""; } } } } }
是程序員都會(huì)對(duì)上面的方法蚩之以鼻,但是沒有辦法了,微軟逼我走上了這條路,不然沒有辦法找到我要的東東。
(3)OleDb的問題
問題:
大家都知道.Net平臺(tái)下訪問數(shù)據(jù)庫(kù)有兩種途徑,一種是SqlClient,另一種就是OleDb,SqlClient是專為SQL Server設(shè)計(jì)的,為了保證程序的兼容性,我們還是得使用OleDb。
使用OleDb是一件令人痛苦的事情,必須有著超人的意志力和耐心,使用OLEDB寫一次程序和做一次惡夢(mèng)沒有兩樣,大家真不知道那些五花八門的錯(cuò)誤出在什么地方。先看下面的程序。
string strInsertRead = "Insert Into UnRead (Judge1_Result,Judge2_Result) "; strInsertRead += " Values (@Judge1_Result,@Judge2_Result)";
OleDbCommand MyComm = new OleDbCommand(strInserRead,MyConn);
MyComm.Parameters.Add("@Judge1_Result",OleDbType.LongVarChar); MyComm.Parameters["@Judge1_Result"].Value = strJudge1_Result;
MyComm.Parameters.Add("@Judge2_Result",OleDbType.LongVarChar); MyComm.Parameters["@Judge2_Result"].Value = strJudge2_Result;
......
MyComm.ExecuteNonQuery();
執(zhí)行這么一段程序,你們認(rèn)為會(huì)報(bào)什么錯(cuò)誤?(注意MyConn是OleDbConnection實(shí)例,已經(jīng)打開)
報(bào)出的錯(cuò)誤是“輸入數(shù)據(jù)類型與數(shù)據(jù)庫(kù)字段類型不匹配!”?
我是想了好久?strJudge1_Result和strJudge2_Result都是string,而數(shù)據(jù)庫(kù)中相應(yīng)字段的為"TEXT",怎么會(huì)相配?怎么也不可能啊。沒有辦法,我改變字段的數(shù)據(jù)庫(kù)類型試著讓數(shù)據(jù)錄入數(shù)據(jù)庫(kù),然后再直接從數(shù)據(jù)庫(kù)中查看錄入的數(shù)據(jù)是什么?
一看不知道,一看就把我氣昏,進(jìn)入數(shù)據(jù)庫(kù)的并不是strJudge1_Result和strJudge2_Result所表示的判斷的結(jié)果,而是設(shè)定的另一個(gè)變量IdCard和Template,兩個(gè)毫不相干的變量怎么會(huì)搞到一起去??我使用Trace查看入庫(kù)前strJudge1_Result的數(shù)據(jù)是正確的,這就說明是在入庫(kù)時(shí)出現(xiàn)的問題,這里就是Parameters屬性做的好事!
我把這個(gè)程序中的OleDB全部改成Sql,程序全部正常!我只能說OleDb的數(shù)據(jù)庫(kù)操作是垃圾(也許說的有些過火),大家如果操作OleDb出現(xiàn)了一堆問題,你要信任自己,有些事情不是你的錯(cuò),而是微軟不想你用其它的數(shù)據(jù)庫(kù)。
解決方法:
如果您是操作SQL Server,那么我建議您直接使用SqlClient,這樣免去很多麻煩。如果非要使用OleDb來操作其它的數(shù)據(jù)庫(kù),請(qǐng)盡量少用Parameters屬性來傳遞參數(shù),而是直接寫進(jìn)SQL語(yǔ)句:
string strInsertRead = "Insert Into UnRead (Judge1_Result,Judge2_Result) "; strInsertRead += " Values ('"+strJudge1_Result+"','"+Judge2_Result+"')";
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!