2011-11-15 55 views
0

我們正在將數據庫後端從Access遷移到SQL Server。當在SqlParameter中使用保留字時「必須聲明標量變量」錯誤

其中一個字段名稱是Key。現在Keya reserved word in both Access and SQL Server因此Access中的解決方法總是在字段名稱周圍放上方括號。

連接到Access時,我們爲每個OleDBCommand生成了一個OleDBParameter集合。在運行時檢查命令CommandText它會讀取類似UPDATE Foo SET [Key]=? WHERE etc的內容,因爲記住OleDB/Access沒有命名參數,只有?。這很好。

快進到今天,並使用SQL Server我們做了類似的事情與SqlCommandSQLParameter。因此,在運行時CommandText讀取類似UPDATE Foo SET [Key][email protected] WHERE etc的東西,因爲SQL不喜歡舊問號的事情,我們必須開始使用命名參數。

麻煩的是應用扼流圈這個命令,他說:

Incorrect syntax near 'varchar'. Must declare the scalar variable "@Key"

這是唯一與受影響的字段名Key表。一切已存活遷移到SQL和其他表(與字段名沒有保留字)的罰款。

我理解的解決方案之一是避免使用保留字作爲一個字段的名字,但我希望的答案,讓我們來解決保留字,因爲我們總是習慣。

+1

您可以發佈您用於命令及其參數綁定的代碼塊嗎?很高興看到你的代碼,以便我們能夠判斷'@ Key'是否是一個未聲明的變量/參數,或者沒有任何東西被綁定到該值佔位符。 – Nonym

回答

2

我不認爲這個錯誤與Key是關鍵字有什麼關係。它希望你告訴它@Key的價值是什麼。

所以,你有你的命令,然後您定義的參數:

Dim cmd As New Sqlcommand("Update Foo SET [Key][email protected]", connection) 
cmd.Parameters.AddWithValue("@Key", SomeValue) 
cmd.ExecuteNonQuery() 

我經常遇到錯誤,因爲我忘了真正定義參數。

+0

你說得對。嗯,但我不知道爲什麼我的更長的囉嗦版本(不使用'AddWithValue')不...看到我的編輯。我將繼續試圖找出它 – hawbsl

+0

你沒有在你的名字@參數,也沒有將它添加到命令參數。 – Jay

+0

再次,你是對的:在簡化爲了複製到stackoverflow,我已經跳過將它添加到命令的參數。這不是原來的問題。仍然在看。 – hawbsl

0

已排序。我們有一些代碼從參數列表中自動生成CommandText。如果參數是保留字,那麼CommandText需要在字段名稱周圍有方括號,但參數本身不能有任何括號。

當然,在良好|訪問的壞日子和OLEDB這只是:

... SET [Key]=? 

這是罰款。

我們更新SQLCLIENT代碼是,產生:

... SET [Key][email protected][Key] 

否則(如果我們去掉了括號):

... SET [email protected] 

既不這是去工作,因爲我們需要的(感謝@D ..)是:

... SET [Key][email protected] 

看起來我們的CommandText自動生成器代碼需要一點重新設計。要麼或者我們清除所有保留字。