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

标签 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 联机丛书和 LINQ-to-SQL 文档中可以找到的所有内容,这应该可以正常工作。

我改为这样做:

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

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

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

如有任何见解,我们将不胜感激!

最佳答案

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

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

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

关于c# - LINQ-to-SQL .ExecuteCommand() 不适用于参数化对象名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6606027/

相关文章:

使用 System.Numerics.Vector 的 C# SIMD 排序/中值

c# - 在 C# 中什么时候使用公共(public)字段比较好?

c# - IsDirty 比较的集合快照

.net - Get-Date 转换为字符串 vs ToString()

sql-server - 使用 SQL 生成 XML 的最佳方式

tsql - SQL Server:使DATETIME持续30分钟

c# - ASPX 身份验证 cookie 过期时间始终为 30 分钟

c# - ThreadPool.QueueUserWorkItem 中的最大排队元素

.net - 如何将 String 数组的所有元素放入 Queue(Of String) 中?

SQL - 添加/禁用基于 Select 语句中的 bool 条件的 Where 子句 (ASP.net SQLDataSource)