18 Stimmen

Wie erhält man die TSQL-Abfrage von LINQ DataContext.SubmitChanges()

Ich verwende Linq to SQL. Ich habe einen DataContext, gegen den ich SubmitChanges()'ing bin. Beim Einfügen des Identitätsfeldes ist ein Fehler aufgetreten, und ich möchte die Abfrage sehen, mit der dieses Identitätsfeld eingefügt wird.

Ich sehe die Abfrage selbst nicht in der Quickwatch; wo kann ich sie im Debugger finden?

0 Stimmen

Sie können Ihren Datacontext auch so konfigurieren, dass die Abfragen in eine Datei ausgegeben werden.

1voto

bopapa_1979 Punkte 8866

Ich stimme zu, dass Linq to SQL Profiler das richtige Werkzeug für diese Aufgabe ist. Aber wenn Sie das Geld nicht ausgeben wollen oder nur etwas Einfaches brauchen, gefällt mir der Ansatz von DebugTextWriter.

Nachdem ich diese Frage gelesen hatte, machte ich mich auf die Suche nach etwas Robusterem. Es stellte sich heraus, dass Damien Guard auch schrieb einen sehr schönen Artikel über die Erstellung verschiedener Writer, um verschiedene Dinge zu behandeln, wie die Ausgabe in den Speicher, Debug, eine Datei, mehrere Ziele oder sogar die Verwendung einfacher Delegaten.

Ich habe einige seiner Ideen aufgegriffen und einen ActionTextWriter geschrieben, der mit mehr als einem Delegaten umgehen kann, und ich dachte, ich würde ihn hier teilen:

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace Writers
{
    public class ActionTextWriter : TextWriter
    {
        protected readonly List<Action<string>> Actions = new List<Action<string>>();

        public ActionTextWriter(Action<string> action)
        {
            Actions.Add(action);
        }

        public ActionTextWriter(IEnumerable<Action<string>> actions)
        {
            Actions.AddRange(actions);
        }

        public ActionTextWriter(params Action<string>[] actions)
        {
            Actions.AddRange(actions);
        }

        public override Encoding Encoding
        {
            get { return Encoding.Default; }
        }

        public override void Write(char[] buffer, int index, int count)
        {
            Write(new string(buffer, index, count));
        }

        public override void Write(char value)
        {
            Write(value.ToString());
        }

        public override void Write(string value)
        {
            if (value == null)
            {
                return;
            }

            foreach (var action in Actions)
            {
                action.Invoke(value);
            }
        }
    }
}

Sie können so viele Aktionen hinzufügen, wie Sie möchten. Dieses Beispiel schreibt über Debug.Write in eine Protokolldatei und in die Konsole von Visual Studio:

// 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<string> writeToDebug = s => Debug.Write(s);
Action<string> writeToLog = s => sw.Write(s);

// Wire up log writers.
fooDc.Log = new ActionTextWriter(writeToDebug, writeToLog);

Und natürlich können Sie, wenn Sie einfachere Modelle aus dem Stegreif verwenden möchten, jederzeit erweitern. ActionTextWriter... den generischen Ansatz schreiben und wiederverwenden, richtig?

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(string path, bool append = false)
        {
            var sw = new StreamWriter(path, append) {AutoFlush = true};
            Actions.Add(sw.Write);
        }
    }
}

-1voto

Vildan Punkte 1837

Hier ist eine detaillierte Beschreibung: http://debugmode.net/2011/06/26/logging-in-linq-to-sql/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X