2008-10-13 19 views
6

Ho alcuni LINQ to SQL che a volte getta unCome si può vedere lo sql che causa un errore su SubmitChanges in LINQ to SQL?

"Impossibile inserire la riga chiave duplicata nell'oggetto 'dbo.Table' con indice univoco 'IX_Indexname'.The istruzione è stata terminata."

C'è un modo in cui posso attivare la registrazione o almeno eseguire il debug nel datacontext per vedere quale SQL viene eseguito nel momento in cui viene generato l'errore?

Aggiornamento: Avrei detto che so sul metodo GetChangeSet(), mi chiedevo se c'è una proprietà sul DataContext che mostra l'ultimo SQL che è stato eseguito, o una proprietà su l'eccezione SQL che mostra l'SQL .

La cosa strana di questo errore è che nei set di cambiamento, c'è solo un aggiornamento & l'unico campo che sta cambiando è un campo datetime che non è nell'indice che causa l'errore.

risposta

11

Un modo semplice per farlo è quello di utilizzare la proprietà DataContext.Log:

using (MyDataContext ctx = new MyDataContext()) 
{ 
    StringWriter sw = new StringWriter(); 
    ctx.Log = sw; 

    // execute some LINQ to SQL operations... 

    string sql = sw.ToString(); 
    // put a breakpoint here, log it to a file, etc... 
} 
+5

L'utilizzo di SQL Profiler sarebbe la soluzione preferibile in quanto non sarebbe necessario modificare il codice. –

2

Durante l'esecuzione di questi problemi di tipo ho utilizzato il SQL Profiler. Fondamentalmente accendendo il profiler, mettendo un punto di interruzione sul salvataggio/aggiornamento, cancellando il profiler e quindi eseguendo solo tale istruzione. Da lì ho tutto l'SQL che è stato eseguito e posso vedere cosa è stato generato. [Lo stavo facendo principalmente attraverso DataServices quindi il .SaveChanges() è una posizione molto comoda per inserire il punto di interruzione]

1

È possibile utilizzare SQL profiler per visualizzare l'SQL mentre sta colpendo il server SQL.

Se volete vedere che cosa è in realtà il cambiamento imposta è necessario utilizzare:

context.GetChangedSet(); 

MSDN - http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.getchangeset.aspx

È possibile quindi visualizzare ogni istruzione SQL prima di essere inviato al server.

L'ultimo punto di chiamata è l'utilizzo della funzionalità di VS 2008 per eseguire il debug attraverso il framework .NET.

2

scrivere un test per isolare il pezzo o pezzi di codice che causano tutti i problemi. Imposta DataContext.Log = Console.Out. Esegui il test con un testrunner (NUnit, MSTest, ecc.). Generalmente i test runner visualizzano qualsiasi cosa stampata su Console.Out insieme ai risultati del test.

1

utilizzare SQL Profiler. È tuo amico e viene fornito con SQL. è possibile visualizzare qualsiasi istruzione SQL che viene eseguita, con il controllo completo sul filtraggio.

0

Sono d'accordo con Bradley Grainger che utilizza la proprietà DataContext.Log è il modo migliore per vedere lo sql eseguito.

Problemi correlati