LINQ-to-SQL .ExecuteCommand()不适用于参数化对象名称

时间:2011-07-07 05:04:01

标签: c# .net tsql sql-server-2008 linq-to-sql

我对此感到有点沮丧,并希望有人能澄清发生了什么。

我想使用我的LINQ-to-SQL数据上下文以编程方式禁用外键约束。看起来这应该像以下一样简单:

context.ExecuteCommand( "ALTER TABLE {0} NOCHECK CONSTRAINT {1}", "MyTable", "FK_MyTable_MyOtherTable" );

不幸的是,这段代码因SQL错误“@ p0'附近的语法不正确而遭到轰炸。”

当我启动分析器时,我发现生成的SQL是:

exec sp_executesql 
N'ALTER TABLE @p0 NOCHECK CONSTRAINT @p1',
N'@p0 varchar(4000),@p1 varchar(4000)',
@p0=N'MyTable',
@p1=N'FK_MyTable_MyOtherTable'

我可以在SQL Books Online和LINQ-to-SQL文档中找到的所有内容都可以正常工作。

我选择这样做:

context.ExecuteCommand( String.Format( "ALTER TABLE {0} NOCHECK CONSTRAINT {1}", "MyTable", "FK_MyTable_MyOtherTable" ) );

它有效,但它有点失败了能够将参数传递给.ExecuteCommand()的目的。

这是LINQ-to-SQL,SQL Server中的某种怪癖,还是我真的很困惑?

非常感谢任何见解!

3 个答案:

答案 0 :(得分:7)

正如您所知 - Linq-to-SQL将非常积极地尝试参数化您的查询。在大多数情况下,这是好事

但是在ALTER TABLE...语句的情况下,诸如表名等之类的东西不能被参数化 - 因此,它失败了。

我不知道是否有任何办法让Linq-to-SQL 参数化某些查询由ExecuteCommand执行 - 与此同时,我认为,不要涉及操纵数据(插入,更新等),而是操纵数据库的结构,最好的办法是在调用{{1}之前使用String.Format(...)方法将实际的SQL查询作为字符串。 }}

答案 1 :(得分:1)

您不能将SQL对象用作参数。因此第二个版本是唯一的选择。

答案 2 :(得分:1)

Linq to SQL基本上只是翻译您提供的内容。问题是您不能将表名作为参数,因此以下操作无效。

DECLARE @TableName varchar

SET @Tablename='MyTable'

SELECT * FROM @TableName

看起来你已经有了一个解决方案,我认为这是一个很好的解决方案。