2013-11-22 29 views
5

我有一個winforms項目取決於自定義庫。除了我無法確定的問題之外,所有與該應用程序的關聯都可以正常工作。基本上我有從另一形式將其顯示爲一個對話創建的形式:破解dubugger不「工作」..代碼執行繼續

DataItems.ImportForm frmImportTextDelimited = new DataItems.ImportForm(); 
frmImportTextDelimited.ShowDialog(); 

此對話框形式從SqlServer的使用下面的函數,它是從在該溶液中類庫填充下拉列表:

public class AuthorityTypeSearcher 
{ 
    public List<IntValuePair> GetAllAuthorityTypes() 
    { 
     List<IntValuePair> returnList = new List<IntValuePair>(); 
     using (var conn = new SqlConnection(Globals.ConnString)) 
     { 
      var cmd = new SqlCommand(); 
      cmd.Connection = conn; 
      cmd.CommandText = "SELECT FROM tblAuthorityTypes"; 
      conn.Open(); 
      IntValuePair ivp; 
      SqlDataReader rdr = cmd.ExecuteReader(); 
      while (rdr.Read()) 
      { 
       ivp = new IntValuePair(); 
       ivp.TheInt = Convert.ToInt32(rdr["ID"]); 
       ivp.TheValue = rdr["AuthorityType"].ToString() ; 
      } 
     } 
     return returnList; 
    } 

這個函數永遠沒有返回值,所以我設置一個斷點就行了:

  conn.Open(); 

當代碼執行時,Visual Studio的正常休息,以這條線。是什麼讓我瘋狂的是,當我邁出第一步到行:

  SqlDataReader rdr = cmd.ExecuteReader(); 

調試將不會前進到下一行,並執行代碼似乎回到UI(顯示格式)。奇怪的是,如果我與表單交互(即單擊填充另一個字段的表單上的按鈕),則調試器再次中斷,然後返回Visual Studio,該工作室正確地「中斷」到與該操作相關的行。無論出於何種原因,當我到達創建數據讀取器的行時,代碼執行看起來像是「離開」庫並返回到winforms應用程序。

當代碼執行似乎已經返回到UI時,如果我返回到Visual Studio看起來代碼執行正在繼續,至少我不能點擊「繼續」(播放)。代碼執行不是「暫停」的。

什麼也奇怪的是,如果我關閉窗體(對話),它打破回調試器從上線的主要形式行:

frmImportTextDelimited.ShowDialog(); 

好像我還在調試。

希望這有道理?我無法弄清楚爲什麼在調試的時候,我無法跨越創建數據讀取器的那一行,爲什麼代碼執行返回到UI,但是在對話框關閉的情況下返回調試器。沒有錯誤被拋出。

感謝您的任何建議!

+1

它只是一個錯字?你的sql查詢沒有列表要返回。 – Steve

+0

你有''SELECT FROM tblAuthorityTypes「'作爲你的查詢。你的意思是,''SELECT * FROM tblAuthorityTypes'''? – Brian

+0

錯字,但對於踢我更新它爲「選擇ID,AuthorityType從tblAthorityTypes」具有相同的結果。 – rune711

回答

4

此行爲的解釋在於在Form_Load期間引發異常時64位代碼的行爲。

您的查詢的語法錯誤。您沒有列列表,這會引發數據庫引擎的語法錯誤。

但是在64位環境中的Form_Load期間引發的異常不能被調試器捕獲。

A more detailed answer could be found here

你可以嘗試修復您的查詢中添加相應的字段名稱(或星*所有字段)。
也嘗試在Visual Studio IDE外部運行代碼。你應該在某處看到異常。

+1

啊!優秀。我在SQL語句中有兩個語法錯誤(我嘗試編輯列名,但打錯了「AuthorityTypes」作爲「AuthorityType」)由於沒有錯誤發生,我不知道。我沒有意識到這個64位應用程序的警告。非常感謝。我開始失去理智。 – rune711

+0

不需要告訴我你對此感覺如何。 :-)我已經去過那裏了 - – Steve

1

嘗試把你的代碼放在try catch塊中,看看內部異常。還不應該是SELECT * FROM tablename?

+0

+1,因爲添加try/catch確實顯示錯誤,儘管史蒂夫解釋了基本的困惑。 – rune711