Comment obtenir la requête TSQL auprès de LINQ DataContext.SubmitChanges ()

J’utilise Linq to SQL. J’ai un DataContext contre lequel je suis. SubmitChanges () ‘ing. Une erreur s’est produite lors de l’insertion du champ d’identité. J’aimerais voir la requête utilisée pour insérer ce champ d’identité.

Je ne vois pas la requête elle-même dans le quickwatch; Où puis-je le trouver dans le débogueur?

Il y a en fait une réponse très simple à votre question

Il suffit de coller ceci dans la fenêtre de votre montre

((System.Data.Objects.ObjectQuery)myLinqQueryVar).ToTraceSsortingng() 

Beaucoup de gens ont écrit leur propre “DebugWriter” et l’ont attaché comme ceci:

 // Add this class somewhere in your project... class DebugTextWriter : System.IO.TextWriter { public override void Write(char[] buffer, int index, int count) { System.Diagnostics.Debug.Write(new Ssortingng(buffer, index, count)); } public override void Write(ssortingng value) { System.Diagnostics.Debug.Write(value); } public override Encoding Encoding { get { return System.Text.Encoding.Default; } } } // Then attach it to the Log property of your DataContext... myDataContext.Log = new DebugTextWriter() 

Cela affichera tout ce que Linq-to-Sql fait dans la fenêtre de débogage de Visual Studio.

Suite à la réponse de Portman , si vous êtes une application console, c’est aussi simple que:

 myDataContext.Log = Console.Out; 

Ou vous pouvez utiliser quelque chose comme Linq2SQL Profiler, qui est un excellent outil et en fait le bon outil pour le travail:

Linq to SQL Profiler – Débogueur visuel en temps réel pour Linq to SQL

Exécutez SQL Profiler si vous l’avez. Il affichera tout le trafic sur votre firebase database, y compris le texte de la commande SQL.

 FooDataContext dc = new FooDataContext(); SsortingngBuilder sb = new SsortingngBuilder(); dc.Log = new SsortingngWriter(sb); var result=from r in dc.Tables select d; ..... ssortingng query=sb.ToSsortingng(); 

Je conviens que Linq to SQL Profiler est le bon outil pour ce travail. Mais si vous ne voulez pas dépenser de l’argent ou si vous avez simplement besoin de faire quelque chose de simple, j’aime bien l’approche DebugTextWriter.

Après avoir lu cette question, je suis parti à la recherche de quelque chose de plus robuste. Il s’avère que Damien Guard a également écrit un très bel article sur la construction d’écrivains différents pour traiter différents problèmes tels que la sortie en mémoire, le débogage, un fichier, plusieurs destinations ou même l’utilisation de simples delegates.

J’ai fini par utiliser quelques-unes de ses idées et écrire un ActionTextWriter pouvant gérer plus d’un délégué, et j’ai pensé le partager ici:

 using System; using System.Collections.Generic; using System.IO; using System.Text; namespace Writers { public class ActionTextWriter : TextWriter { protected readonly List> Actions = new List>(); public ActionTextWriter(Action action) { Actions.Add(action); } public ActionTextWriter(IEnumerable> actions) { Actions.AddRange(actions); } public ActionTextWriter(params Action[] actions) { Actions.AddRange(actions); } public override Encoding Encoding { get { return Encoding.Default; } } public override void Write(char[] buffer, int index, int count) { Write(new ssortingng(buffer, index, count)); } public override void Write(char value) { Write(value.ToSsortingng()); } public override void Write(ssortingng value) { if (value == null) { return; } foreach (var action in Actions) { action.Invoke(value); } } } } 

Vous pouvez append autant d’actions que vous le souhaitez. Cet exemple écrit dans un fichier journal et dans la console de Visual Studio via Debug.Write:

 // Create data context var fooDc = new FooDataContext(); // Create writer for log file. var sw = new StreamWriter(@"C:\DataContext.log") {AutoFlush = true}; // Create write actions. Action writeToDebug = s => Debug.Write(s); Action writeToLog = s => sw.Write(s); // Wire up log writers. fooDc.Log = new ActionTextWriter(writeToDebug, writeToLog); 

Et bien sûr, si vous souhaitez simplifier l’utilisation à la volée, vous pouvez toujours étendre ActionTextWriter … écrire l’approche générique et la réutiliser, n’est-ce pas?

 using System.Diagnostics; using System.IO; namespace Writers { public class TraceTextWriter : ActionTextWriter { public TraceTextWriter() { Actions.Add(s => Trace.Write(s)); } } public class FileTextWriter : ActionTextWriter { public FileTextWriter(ssortingng path, bool append = false) { var sw = new StreamWriter(path, append) {AutoFlush = true}; Actions.Add(sw.Write); } } } 

Voici une description détaillée: http://debugmode.net/2011/06/26/logging-in-linq-to-sql/