.Net正式版中的一些Bug及其解決方案

來源:互聯網
上載者:User
解決 .Net正式版中的一些Bug及其解決方案 (原創)
作者: 飛刀     
(1)Session的問題

問題:

在我的Windows.Net 3604 + .Net Framework正式版的編程環境中,.Net下的Session總是有問題,比如我在A程式下設定了一個Session字典,這個Session將會在B程式下讀取,現在的情況就是我在B程式讀取這個Session時,第一次能夠正常讀取,但一旦頁面被提交(這在Asp.Net編程中是常有的事情),Session就會馬上消失,錯誤報表“Object is null”,使用Trace發現此Session已經不存在。

此問題排除瀏覽器不支援Cookie的可能,因為我讀取Cookie是正常的。

解決方案:

使用Session的CookieLess狀態,具體操作即更改web.config或machine.config檔案,這樣Session的傳值是在URL中進行的。
使用Cookie,Cookie是可以正常使用的,只要瀏覽器沒有關閉此功能。
(2)FindControl方法的問題

問題:

大家都知道所有控制項集合都存在有一個FindControl方法,一般最常用的地方就是DataGrid對Item中控制項的操作。這是一個很好用的方法,可以讓我們迅速地找到我們想要的控制項,但是他也是我遇到過的最不穩定的方法。

在Item中使用這個方法,一般不會出現什麼問題,但是在DataGrid、DataList的各種事件中這個方法經常是找不到控制項!!DataGrid還好一點,DataList的事件中發生的情況就慘不忍睹,100%的找不到控制項!!這個控制項是活生生存在的,使用Controls集合中是可以發現這個控制項的。這個問題我在Beta2下就已經發現了,原以為微軟會在正式版本中更正,不知道是沒有人提出呢?還是沒有發現,正式版中依然這樣。

開始我以為FindControl這個方法沒有寫好,我就自個重寫了這個方法,但是當我高興地去用我自個寫的方法時,發現傳回來的值還是null!!!現在也就只有一個解釋了,那就是.Net環境中對Control類型的支援還是不穩定的。

解決方案:

即然通過編寫方法傳回值的方法搞不定,那麼就只有用最原始的方法,在本函數內,直接列舉Controls集合中的控制項,直到找到這個控制項為止。

private void ShowQuestion_ItemDataBound(object sender, System.Web.UI.WebControls.DataListItemEventArgs e)
{
//當傳回值為Control類型,經常出現空值

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 = "";
                }
            }
         }
      }
}

是程式員都會對上面的方法蚩之以鼻,但是沒有辦法了,微軟逼我走上了這條路,不然沒有辦法找到我要的東東。

(3)OleDb的問題

問題:

大家都知道.Net平台下訪問資料庫有兩種途徑,一種是SqlClient,另一種就是OleDb,SqlClient是專為SQL Server設計的,為了保證程式的相容性,我們還是得使用OleDb。

使用OleDb是一件令人痛苦的事情,必須有著超人的意志力和耐心,使用OLEDB寫一次程式和做一次惡夢沒有兩樣,大家真不知道那些五花八門的錯誤出在什麼地方。先看下面的程式。

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();

執行這麼一段程式,你們認為會報什麼錯誤?(注意MyConn是OleDbConnection執行個體,已經開啟)

報出的錯誤是“輸入資料類型與資料庫欄位類型不符!!”?

我是想了好久?strJudge1_Result和strJudge2_Result都是string,而資料庫中相應欄位的為"TEXT",怎麼會相配?怎麼也不可能啊。沒有辦法,我改變欄位的資料庫類型試著讓資料錄入資料庫,然後再直接從資料庫中查看錄入的資料是什嗎?

一看不知道,一看就把我氣昏,進入資料庫的並不是strJudge1_Result和strJudge2_Result所表示的判斷的結果,而是設定的另一個變數IdCard和Template,兩個毫不相干的變數怎麼會搞到一起去??我使用Trace查看入庫前strJudge1_Result的資料是正確的,這就說明是在入庫時出現的問題,這裡就是Parameters屬性做的好事!

我把這個程式中的OleDB全部改成Sql,程式全部正常!我只能說OleDb的資料庫操作是垃圾(也許說的有些過火),大家如果操作OleDb出現了一堆問題,你要信任自己,有些事情不是你的錯,而是微軟不想你用其它的資料庫。

解決方案:

如果您是操作SQL Server,那麼我建議您直接使用SqlClient,這樣免去很多麻煩。如果非要使用OleDb來操作其它的資料庫,請盡量少用Parameters屬性來傳遞參數,而是直接寫進SQL語句:

string strInsertRead = "Insert Into UnRead (Judge1_Result,Judge2_Result) ";
strInsertRead += " Values ('"+strJudge1_Result+"','"+Judge2_Result+"')";




相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。