2010-01-24 52 views
1

如何獲取由LinqToSql生成的更新方法的sql?如何獲取由LinqToSql生成的sql更新方法?

我用下面的代碼顯示在VS2008的調試輸出窗口由LinqToSql生成的SQL,但它只是變得生成的SQL SELECT方法,

我怎麼能找到被LinqToSql生成的SQL更新方法?

我知道Sql Server Profiler和LinqPad可以得到它(生成的sql-update),但我想在VS2008中顯示它們或將它們記錄到文件中。

public partial class Linq2 : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      DemoDataContext ctx = new DemoDataContext(); 

      // Then attach it to the Log property of your DataContext... 
      ctx.Log = new DebugTextWriter(); 

      var product = ctx.Products.FirstOrDefault(); 

      product.ProductName = "NewName1"; 

      ctx.SubmitChanges();    

     } 
    } 

    // Add this class somewhere in your project... 
    public class DebugTextWriter : System.IO.TextWriter 
    { 
     public override void Write(char[] buffer, int index, int count) 
     { 
      System.Diagnostics.Debug.Write(new String(buffer, index, count)); 
     } 

     public override void Write(string value) 
     { 
      System.Diagnostics.Debug.Write(value); 
     } 

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

我也得到在VS2008調試輸出窗口中的SQL選擇查詢:

SELECT TOP (1) [t0].[Id], [t0].[ProductName] …… 
FROM [dbo].[Products] AS [t0] 
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.30729.1 

回答

0

謝謝你所有的答案。 我發現Linq To SQL Profiler來解決這個問題。

1

你的數據庫上下文對象有一個登錄方法,你可以重寫。您的完整Update語句以及Linq-To-SQL生成的每個SQL命令都可以通過此Log方法捕獲。我知道這是有效的,因爲我用它來捕獲我們應用程序中的所有查詢。請記住,L2S可以向Log方法發送相當數量的輸出,因此請確保將其全部捕獲。你的Update語句在某處。

+0

你能提供更多的細節嗎?我在上下文中找不到sql語句.Log – Mike108 2010-01-25 02:50:08

+0

上下文對象有一個System.IO.TextWriter方法,您可以將偵聽器附加到該方法。在我的情況下,我創建了一個名爲SQLLogWriter的StringWriter類,並執行以下操作:context.Log = SQLLogWriter。所有的L2S輸出都會發給這位作者。 – 2010-01-25 12:40:49

+0

你能提供代碼嗎?我使用了一些StringWriter類,它們只記錄L2S的sql select語句。你確定你可以將sql更新語句記錄到StringWriter類嗎? – Mike108 2010-01-25 22:07:02