2013-08-07 39 views
1

我寫了一個在網絡中工作的Windows基本程序。試圖讀取或寫入受保護的內存。這通常表明其他內存已損壞

首先,我有一個自動完成文本框,它正在讀取數據庫中的名稱,並根據它們輸入的字母向用戶顯示。

程序工作正常但是它有時有這樣的錯誤

現在我已經添加了另一個自動完成文本框從數據庫中讀取,現在的第一自動完成正常工作,但是當我想填補第二文本框它顯示此錯誤並凍結。

有趣的是,該程序在服務器上正常工作,只在客戶端顯示此錯誤。 即使它沒有任何錯誤,當我在我的筆記本電腦上執行它或其他筆記本電腦時,我使用我的筆記本電腦在家中與他們建立了網絡,但它只在辦公室的客戶端計算機上出現錯誤。

請幫我解決這個問題。

謝謝

充分例外內容是:

-----Exception Type Is : UnHandled 
-----Exceptiotn Message is : Attempted to read or write protected memory. This is often an indication that other memory is corrupt. 
-----Source that causes this error: System.Windows.Forms 
-----StackTrace is : at System.Windows.Forms.UnsafeNativeMethods.DispatchM essageW(MSG& msg) 
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoCompo nentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData) 
at System.Windows.Forms.Application.ThreadContext.Run MessageLoopInner(Int32 reason,ApplicationContext context) 
at System.Windows.Forms.Application.ThreadContext.Run MessageLoop(Int32 reason,ApplicationContext context) 
at System.Windows.Forms.Application.Run(Form mainForm) 
at Project1.Program.Main() in C:\Users\ZY\Documents\Visual Studio 2008\Projects\Project1\Project1\Program.cs:line 25 

我自動完成代碼:

private void txtkhrdsharh_TextChanged(object sender, EventArgs e) 
    { 

      AutoCompleteStringCollection namecollection = new  AutoCompleteStringCollection(); 
      BLL objbll = new BLL(); 
      SqlDataReader rea = objbll.SelectSharhlistF(txtkhrdsharh.Text); 
      if (rea.HasRows == true) 
      { 
       while (rea.Read()) 
        namecollection.Add(rea["sharh"].ToString()); 
      } 
      rea.Close(); 

      txtkhrdsharh.AutoCompleteMode = AutoCompleteMode.Suggest; 
      txtkhrdsharh.AutoCompleteSource = AutoCompleteSource.CustomSource; 
      txtkhrdsharh.AutoCompleteCustomSource = namecollection; 
    } 
+2

調用所有的心理調試...... – spender

+0

「它凍結」?要麼沒有足夠的硬件,要麼你在撒謊。 –

+0

發生未處理的異常,出現異常對話框,程序死機...非常確定這是什麼意思 –

回答

1

我發現了這個問題。 正如Jim所說,它與我的自動完成代碼有關,該代碼通過用戶輸入的每個字母向服務器發送請求。而且服務器很弱,無法回答這麼多請求。 我將代碼更改爲下面的代碼並解決了問題。 我把代碼在這裏:一些人想使用自動完成首次(像我一樣),它可能是有用的:

   private void frm1_Load(object sender, EventArgs e) 
    { 
      AutoCompleteStringCollection namecollectionF = new AutoCompleteStringCollection(); 
     BLL objbll1 = new BLL(); 
     SqlDataReader dReader = objbll1.SelectNamelistF(); 
     if (dReader.HasRows == true) 
     { 
      while (dReader.Read()) 

       namecollectionF.Add(dReader["Name"].ToString()); 

     } 
     else 
     { 
      MessageBox.Show("Data not found"); 
     } 
     dReader.Close(); 

     txtForooshande.AutoCompleteMode = AutoCompleteMode.Suggest; 
     txtForooshande.AutoCompleteSource = AutoCompleteSource.CustomSource; 
     txtForooshande.AutoCompleteCustomSource = namecollectionF; 
     } 
4

您的代碼非常混亂。只要文本框中的文本發生更改,就會修改自動填充設置。爲什麼要這麼做?通常,當您創建文本框時,您將設置自動完成。就目前而言,每當用戶按下文本框上的按鍵時,都會更改設置。

我會承認我不知道爲什麼(或者甚至是)會導致程序崩潰,但它可能至少是一個性能問題,並可能導致一些非常奇怪的行爲。

我懷疑你想要重新訪問你的實現,並在表單第一次顯示時進行自動完成設置。

在Windows消息處理程序中引發異常 - 消息循環由應用程序運行。這不是你編寫的代碼,而且很可能很難看出發生錯誤的位置。

但是,當發生錯誤時,確定將非常有用。如果您可以在調試器中加載該程序並單步執行TextChanged事件處理程序,則可能能夠確定哪一行代碼會觸發該異常。

+0

您被問到:但是,確定何時發生錯誤將非常有用。答案是當我在第一個文本框中輸入字母時,它沒有問題,並顯示所有名稱在自動完成中,但是當我將字母輸入到第二個自動填充文本框時,錯誤apears –

+0

@PhoenixPhoenix:也許問題不在處理程序中。如果註釋掉TextChanged處理程序中的代碼,是否會發生錯誤?另外,除非您在調試器中加載程序並單步處理程序代碼,否則無法提供更多幫助,因此您可以告訴我們哪行代碼會觸發異常。 –

+0

,我沒有undrestand自動完成代碼的問題是什麼?代碼應該由用戶輸入的每個字母執行,例如對於名稱JOHN,首先應該在數據庫中搜索名稱以J開頭的名稱,然後搜索名稱,然後開始JO等等。這是錯的嗎 ? –

相關問題