2013-04-23 63 views
3

使用ExecuteCommand我要執行我的數據庫語句:在LINQ

/*Disable Constraints & Triggers*/ 
exec sp_MSforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' 
exec sp_MSforeachtable 'ALTER TABLE ? DISABLE TRIGGER ALL' 

/*Perform delete operation on all table for cleanup*/ 
exec sp_MSforeachtable 'SET QUOTED_IDENTIFIER ON; DELETE ?' 

/*Enable Constraints & Triggers again*/ 
exec sp_MSforeachtable 'ALTER TABLE ? CHECK CONSTRAINT ALL' 
exec sp_MSforeachtable 'ALTER TABLE ? ENABLE TRIGGER ALL' 

/*Reset Identity on tables with identity column*/ 
exec sp_MSforeachtable 'IF OBJECTPROPERTY(OBJECT_ID(''?''), ''TableHasIdentity'') = 1 BEGIN DBCC CHECKIDENT (''?'',RESEED,0) END' 

我有我的LINQ的DataContext:

public static bool ClearDatabase() 
     { 
      GetContext().ExecuteCommand(""); 
     } 

說不清楚在MSDN文檔是零件...我是否應該將每個語句作爲單獨的命令運行,還是要執行一個很長的字符串?

我是否應該保留exec語句?另外,如果有人知道用LINQ清除數據庫的更好方法,請告訴我。

感謝

+0

您可以測試您是否可以在一個命令中執行多個語句。您可以爲其設置SQL分析器並查看由LINQ to SQL生成的SQL查詢。 – polkduran 2013-04-23 12:45:49

回答

6

Execute簡單地執行它;裏面是完全不透明的(除了{0}等,它用來表示參數 - 即{0}變成類似@_p0,其值由params陣列提供)。因此,只要您的TSQL有效(並且不包括GO等),那麼它應該可以正常工作。它當然不在乎TSQL是否很長。但是:嘗試一下。

但是,我個人認爲從數據上下文運行這種方法是有風險的,因爲數據上下文可能有緩存狀態,這可能會使事情混淆。就我個人而言,我會直接從ADO.NET運行它(或通過像「dapper」這樣的助手)。但是我認爲如果你在做這些之後立即拋棄+丟棄(也許是重新創建)數據上下文,它就可以正常工作。