2013-04-23 57 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”这样的助手)。但是我认为如果你在做这些之后立即抛弃+丢弃(也许是重新创建)数据上下文,它就可以正常工作。