LINQ-to-SQL . executecommand()不能处理参数化的对象名称

本文关键字:对象 参数 处理 executecommand 不能 LINQ-to-SQL | 更新日期: 2023-09-27 18:01:19

我对这个有点困惑,希望有人能澄清这是怎么回事。

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

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

不幸的是,这段代码出现了SQL错误"'@p0'附近语法不正确"。

当我启动profiler时,我看到生成的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图书在线和在LINQ-to-SQL文档这应该只是工作。

我只好这样做了:

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

它可以工作,但它有点违背了能够向. executecmand()传递参数的目的。

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

任何见解将不胜感激!

LINQ-to-SQL . executecommand()不能处理参数化的对象名称

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

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

我不知道是否有任何方法可以让Linq-to-SQL 参数化某些查询由ExecuteCommand执行-同时,我认为,语句不涉及操纵数据(插入,更新等),而是操纵数据库的结构,您最好的选择是使用String.Format(...)方法获得实际的SQL查询作为字符串,在调用.ExecuteCommand()之前。

不能使用SQL对象作为参数

所以第二个版本是唯一的选择

Linq to SQL基本上只是翻译你给它的东西。问题是你不能把表名作为参数,所以下面的代码不起作用。

DECLARE @TableName varchar
SET @Tablename='MyTable'
SELECT * FROM @TableName

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