gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:27:24 25 4
gpt4 key购买 nike

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

我想使用我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com