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将非常积极地尝试将您的查询参数化。这是一个好东西,在大多数情况下。
但是在ALTER TABLE...
语句的情况下,像表名等不能被参数化-因此,它失败了。
我不知道是否有任何方法可以让Linq-to-SQL 不参数化某些查询由ExecuteCommand
执行-同时,我认为,语句不涉及操纵数据(插入,更新等),而是操纵数据库的结构,您最好的选择是使用String.Format(...)
方法获得实际的SQL查询作为字符串,在调用.ExecuteCommand()
之前。
不能使用SQL对象作为参数
所以第二个版本是唯一的选择
Linq to SQL基本上只是翻译你给它的东西。问题是你不能把表名作为参数,所以下面的代码不起作用。
DECLARE @TableName varchar
SET @Tablename='MyTable'
SELECT * FROM @TableName
看起来你已经有一个解决方案了,而且我认为这个方案很好。