2013-11-22 5 views
5

Ho un progetto winforms che dipende da una libreria personalizzata. Tutto con l'app funziona perfettamente, tranne un problema che non riesco a definire. Fondamentalmente Ho una forma che viene creato da un altro modulo che visualizza come una finestra di dialogo:L'interruzione di dubugger non "funziona". L'esecuzione del codice continua

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

Questa forma di dialogo popola un elenco a discesa dal SqlServer usando la funzione di sotto del quale è da una libreria di classi nella soluzione:

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

Questa funzione non restituisce un valore, in modo da impostare un punto di interruzione sulla linea:

  conn.Open(); 

Quando il codice viene eseguito, Visual Studio rompe correttamente questa linea. Quello che sta facendo impazzire è che quando faccio un passo in avanti per la linea:

  SqlDataReader rdr = cmd.ExecuteReader(); 

Il debugger non si sposta in avanti alla riga successiva, e l'esecuzione di codice sembra di tornare all'interfaccia utente (viene visualizzato il modulo). Ciò che è anche strano è che se interagisco con il modulo (cioè, clicco su un pulsante sul modulo che popola un altro campo), il debugger si interrompe di nuovo, torno allo studio visivo, che si "spezza" correttamente alla linea relativa a quell'operazione. Sembra che, per qualsiasi motivo, quando arrivo alla linea che crea il lettore di dati, l'esecuzione del codice semplicemente "lascia" la libreria e ritorna all'app winforms.

Quando l'esecuzione del codice sembra essere tornata all'interfaccia utente, se torno allo studio visivo sembra che l'esecuzione del codice continui, almeno non riesco a fare clic su "continua" (riproduzione). L'esecuzione del codice non è "in pausa".

Qual è anche strano è che se chiudo la forma (finestra), si rompe di nuovo nel debugger sulla linea dal modulo principale sulla linea:

frmImportTextDelimited.ShowDialog(); 

come se fossi ancora il debug.

Speriamo che questo abbia senso? Non riesco a capire perché, durante il debug, non riesca a superare la riga in cui creo il lettore di dati e perché l'esecuzione del codice ritorni all'interfaccia utente, ma ritorna al debugger con la finestra di dialogo chiusa. Nessun errore è mai stato lanciato.

Grazie per qualsiasi consiglio!

+1

È solo un refuso? La query sql non ha l'elenco di colonne da restituire. – Steve

+0

Hai '" SELECT FROM tblAuthorityTypes "' come tua richiesta. Intendevi qualcosa come, '" SELECT * FROM tblAuthorityTypes "'? – Brian

+0

In genere ma per i calci l'ho aggiornato a "SELECT ID, AuthorityType FROM tblAthorityTypes" con gli stessi risultati. – rune711

risposta

4

La spiegazione di questo comportamento si trova nel comportamento del codice a 64 bit quando viene sollevata un'eccezione durante Form_Load.

La sintassi della query è errata. Non hai un elenco di colonne e questo genera un errore di sintassi dal tuo motore di database.

Ma un'eccezione generata durante un Form_Load in un ambiente a 64 bit non può essere intrappolata dal debugger.

A more detailed answer could be found here

Si potrebbe tentare di risolvere la query aggiungendo i nomi dei campi appropriati (o una stella * per tutti i campi).
Prova anche a eseguire il codice all'esterno dell'IDE di Visual Studio. Dovresti vedere l'eccezione da qualche parte.

+1

AH! Eccezionale. Ho avuto due errori con la sintassi nell'istruzione SQL (avevo provato a modificare i nomi delle colonne, ma ho digitato "AuthorityTypes" come "AuthorityType"). Dal momento che nessun errore è mai stato gettato non ne avevo idea. Non ho capito questo avvertimento di app a 64 bit. Molte molte grazie. Stavo iniziando a perdere la testa. – rune711

+0

Non ho bisogno di dirmi come ti senti su questo. :-) Sono già stato lì- – Steve

1

Prova a inserire il codice in un blocco catch try e dai un'occhiata all'eccezione interna. Inoltre, non dovrebbe essere SELECT * FROM tablename?

+0

+1 perché l'aggiunta del try/catch ha mostrato l'errore sebbene la confusione di base fosse il problema che Steve ha spiegato. – rune711

Problemi correlati