2012-04-20 58 views
23

在我們的應用中的一個傳遞到存儲過程以這種方式是否需要在SqlParameter名稱的前面添加@?

Dim parm As New SqlParameter("searchText", SqlDbType.VarChar) 
parm.Direction = ParameterDirection.Input 
parm.Size = 50 
parm.Value="test" 

cmd.Parameters.Add(parm) 

和過程的參數包含參數爲@searchText

即從代碼中傳遞的參數名稱爲searchText,並且在存儲過程是@searchText

但它工作正常,我總是得到所需的結果。

所以我的問題是這樣的,所以沒有必要指定@之前的參數?是否會追加@,誰能請給出一個答案。

回答

22

to the documentation,名稱必須與@開始:

的參數名稱的形式@paramname規定。

根據源代碼(看看在參考源和SqlCommandSqlParameter.ParameterNameFixed)中,如果需要一個@自動添加。

所以是的,它的工作原理,但它是一個無證的功能。最佳做法建議您不要依賴此選項並手動爲您的參數名稱加上@

+0

所以你說它會自動在參數名稱前加@。對? – 2012-04-20 11:50:14

+4

@mahesh:在目前的實施中,據我所知,是的。由於它是一個未記錄的功能,它可能會隨時更改(例如,在新的框架版本中),恕不另行通知。 – Heinzi 2012-04-20 11:51:15

+0

好的,謝謝..但我想知道它是怎麼發生的...... – 2012-04-20 11:53:35

2

價:SqlParameter.ParameterName PropertyIDataParameter.ParameterName Property

的參數名稱在形式@paramname指定。在執行依賴於參數的SqlCommand之前,您必須設置ParameterName。如果您使用Sql Server作爲數據庫,那麼您必須在參數名稱前指定@之前的@。

您的參數名稱必須與後端相同,例如:你有@searchText然後在參數規格就必須SqlParameter("@searchText" ..

你的代碼應該是這樣的

Dim parm As New SqlParameter("@searchText", SqlDbType.VarChar) 
parm.Direction = ParameterDirection.Input 
parm.Size = 50 
parm.Value="test" 

cmd.Parameters.Add(parm) 

注:Oracle和SQLite使用不同使用不同的字符來指定參數,並有可能成爲@符號未使用ado.net的規範指定。

編輯:通過評論

正如你所指定的link,它也是某種固定的,但作爲每MSDN文檔,你必須無論您是使用任何數據提供指定用「@」的位置參數oledb,sql,odbc。 Ref

if (0 < parameterName.get_Length() && '@' != parameterName.get_Chars(0)) 
     { 
      parameterName = "@" + parameterName; 
     } 
+0

是的,我知道它應該是@ searchText,但我的問題是,如果我使用參數名稱searchtext,那麼我也得到正確的結果.. – 2012-04-20 11:49:24

+0

你的回答說,案件在參數名稱中很重要。實際上是這樣嗎?我的回憶似乎認爲案例匹配並不重要。 – 2012-04-20 12:22:28

+0

@Andrew Barber:不是,但是在開始時不帶@地傳遞參數 – 2012-04-23 03:00:55

0

它不是強制指定@。但是,這是最佳做法。

其類似於字符串。有肯定是在.NET定義字符串作爲這種無傷害:

string s; 
//Rest of the code follows; 

但同樣,它的最佳實踐來定義它們爲:

string s = string.Empty; 

你看,它的公約的問題,最好的做法!

0

我建議您在參數名稱中加上「@」標記。 SqlParameter有助於自動添加,但其他人的參數可能不會。

相關問題