2010-02-24 51 views
1

我正在研究一種正在對現有數據庫進行改進的內容管理系統,並且數據庫中有許多表格。將會有一個臨時數據庫,我們將在這裏進行更改並允許用戶「就地預覽」。然後,必須批准任何更改,併發布它們,我們將連接到相同數據庫的實時版本(相同模式)並播放捕獲的更改。有沒有什麼辦法在Linq To SQL中獲取SubmitChanges()調用中發生的底層(原始)SQL?

我發現了一些代碼(稱爲Doddle Audit),它具有一些定製功能,可以爲我提供有關正在改變的信息。我能夠獲取更新,插入和刪除之前和之後的所有列的列表。但我真正想要的是由SubmitChanges()運行的底層SQL。 LinqToSql必須生成這個,所以爲什麼我不能擁有它?

我搜索了一下,看了一下涉及SubmitChanges的代碼,把東西放在了一邊,我似乎無法找到它。有誰知道一種方法來獲得這個?

回答

0

您可以使用SQL Server Profiler,而不是Linq To SQL Profiler,但是免費。

要獲得在字符串中的SQL語句,你可以做這樣的事情:

using (var context = new MyDataContext()) 
{ 
    var query = from p in context.Persons 
      select p; 
    string sql = context.GetCommand(query).CommandText; 


} 
+0

那麼,我知道我可以配置文件,從調試的角度來看,發生了什麼。但是,我需要一些能夠在代碼中捕獲正在發送和存儲的內容。所以這不是一個調試功能。 – 2010-02-24 19:03:11

+0

我已經編輯了更多的信息 – gautema 2010-02-24 19:36:54

+0

我的答案正確的是有可能得到一個選擇的SQL。問題在於更新/插入/刪除。我有一系列的變化,我正在審覈所有這些變化並記錄下來。本身沒有「查詢」。 – 2010-02-24 19:53:54

1

你可以試試這個:

Console.WriteLine(context.GetCommand(查詢).CommandText) ;

希望這會有所幫助。

感謝,

拉賈

+0

如果有人想知道我最終做了什麼...... Linq to Sql對於這個項目來說還不夠好。我使用了我非常熟悉的SubSonic 2.2。我開發了一個ChangeSet類,它允許您傳入記錄和查詢命令並記錄在數據庫上運行的SQL。 在這裏使用亞音速的另一個好處是changeset類(它在2個部分類中定義,一個自定義代碼,一個生成)可以被序列化並存儲在會話中。因此,在任何給定的「內容區域」中,N個回傳中的M個變化可以排隊到一個「變更集」中。 – 2010-03-03 16:51:37

3

使用DataContext.Log屬性是這樣的:

using(DataContext dc = new DataContext()){ 
    StringBuilder sb = new StringBuilder(); 
    dc.Log = new StringWriter(sb); 
}

你會看到在調試模式下生成的查詢。

+0

對於調試場景,編寫一個使用Debug.WriteLine等的Writer可能非常有用:) – cyberzed 2010-02-25 15:37:08

+0

這非常酷,絕對很好理解......但我只是調試了我正在進行更新的測試場景,幾個刪除(子記錄)和插入,儘管那個stringbuilder向我展示了select命令,但它沒有顯示任何插入/更新/刪除命令:( – 2010-02-26 14:31:18

相關問題