2011-07-07 91 views
4

我被這個人弄糊塗了,希望有人能澄清一下發生了什麼。LINQ-to-SQL .ExecuteCommand()不適用於參數化對象名稱

我想以編程方式禁用使用我的LINQ到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到SQL文件中這應該只是工作。

我使出這樣做,而不是:

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

它的工作原理,但那種失敗)的能夠在參數傳遞給.ExecuteCommand目的(。

那麼,這是LINQ到SQL,SQL Server的一種怪癖嗎?還是我真的很困惑?

任何見解將不勝感激!

回答

7

正如你已經發現的--Linq-to-SQL將非常積極地嘗試參數化你的查詢。在大多數情況下,哪個是好東西

但在ALTER TABLE...聲明的情況下,像表名等不能被參數化 - 因此,它失敗。

我不知道是否有得到的LINQ到SQL來某些參數多查詢由ExecuteCommand執行的任何方式 - 在同時,我認爲,不涉及操縱數據的語句(插入,更新等),而是操縱數據庫的結構,最好的辦法是在調用.ExecuteCommand()之前,使用String.Format(...)方法獲取實際的SQL查詢字符串。

+1

感謝您的簡要解釋。非常感激。 –

+0

ALTER TABLE是一種數據定義語言(DDL)類型的語句。所以我認爲LINQ在這裏倒下來是合理的。我沒有看到任何聲稱LINQ是DDL工具。 – rism

1

你不能使用SQL對象作爲參數。

所以第二個版本是唯一的選擇。

+0

明白了。謝謝! –

1

Linq to SQL基本上只是翻譯你給它的東西。問題是你不能有表名作爲參數,所以以下不起作用。

DECLARE @TableName varchar 

SET @Tablename='MyTable' 

SELECT * FROM @TableName 

它看起來像你已經有一個解決方案,我認爲這是一個很好的解決方案。

+0

有道理。而且,當然,LINQ-to-SQL無法知道我的參數是對象名稱。 –