2013-04-11 125 views
0

我們解決方案的一部分是使用ASP Gridview顯示公司特定信息的頁面。我們構建提供Gridview的SQL的方法是使用C#根據一系列用戶輸入構建自定義SELECT語句。變量名稱'@'已被聲明

一旦用戶通過一個button click應用於他們的過濾器,C#遍歷所有他們的選擇(check boxes and text boxes),然後傳播這些選擇到它構建一個WHERE條款附加到一個簡單的SELECT聲明一個單獨的方法。我們使用Table-Valued Function in the FROM statement,唯一的輸入參數來自Querystring,並且在整個過程中不會改變。

一旦使用C#彙編查詢,我們將此查詢作爲Select Command應用於SqlDataSource。然而,我們最近發現,我們還沒有見過一個很奇怪的SQL錯誤:

錯誤:

"The variable name '@' has already been declared

Variable names must be unique within a query batch or stored procedure.

我們沒有任何聲明的變量在我們的SQL。如上所述,唯一的輸入參數來自Querystring,而我們在ASP:SqlDataSource在ASP側訪問同時使用QueryStringParameters此參數和「int.Parse(Request.QueryString["id"]).ToString()」在構建SQL查詢時在C#端

在研究了這個錯誤之後,我還沒有找到一個變量聲明爲空的實例,大多數人在聲明一個變量時會得到與此類似的錯誤例如'@email' or '@address'兩次,我們沒有雙重解密而且錯誤中的變量沒有被定義的事實正在引起大量頭痛。

以前有沒有人看過類似的東西,或者對如何進一步調試有什麼建議?

我會發布一些代碼,如果需要的話,但我們最感興趣的是看看有沒有人看到過這樣的錯誤。

代碼

string MainQueryStr = ResultsPages.SearchString(SearchVariables(), Request, 
       ProjectsSqlds, 0, "SELECT DISTINCT dbo.{0}.* FROM dbo.{0}(" + int.Parse(Request.QueryString["id"]).ToString() + ")", 
       "getXyzById", "AbcId"); 
     StringBuilder SearchQueryStr = new StringBuilder(); 
     SearchQueryStr.Append(MainQueryStr); 
     SearchQueryStr.Append(" ORDER BY AbcName"); 
     ProjectsSqlds.SelectCommand = SearchQueryStr.ToString(); 

搜索字符串函數的是,我們現在不能發表500線法。它用在我們所有的解決方案中,並按照它的原理工作。它將字符串拼接在一起以創建查詢。

這是SearchString在功能如何追加參數:

l.Add(ResultsPages.NewSearchQueryString(ABCFiltersTxBx, SearchQueryStringVariableType.String, 
      "{1}.AbcID IN (" + ABCFiltersTxBx.Text + ")")); 

凡ABCFiltersTxBx被解析成一個逗號分隔字符串。

+0

您是否查看了導致錯誤的查詢生成的SQL?我會從那裏開始,並尋找使用'@'的任何地方。我的猜測是,錯誤的原因將變得相當明顯。 – Servy 2013-04-11 16:40:32

+0

是的,我們已經查看了該頁面加載時的SQL並沒有發生任何中斷,並且在附加了Where子句之後,也沒有任何內容突破。 – user2271111 2013-04-11 16:42:25

+0

那麼它什麼時候突破? SQL在當時的樣子是什麼樣的? – Servy 2013-04-11 16:45:36

回答

1

我應該附和作爲問題在這裏監事:

OK,所以我們想出了什麼事。

我們沒有意識到的是SQLDataSource將我們附加的WHERE子句作爲SelectParameters使用。我們希望添加到查詢中的每個參數最終會提供給SQLDS,然後將它們作爲SelectParameter添加,但我們並沒有意識到這一點,並且因爲我們沒有做任何明確的參數聲明,所以只添加了參數「」作爲名稱,導致「@」的錯誤已被聲明「。

這整個事情最令人尷尬的部分是我們的API已經佔據了參數名稱,但我們無意中排除了這部分。非常感謝您閱讀並嘗試提供幫助。我們非常感謝您花時間幫助我們在這裏集思廣益。

,所以我想這整個錯誤的拿回家的是兩個部分:

  1. 知道你的API。當你意識到自己搞砸了,感謝那些花時間在StackOverflow上幫助你的人(或者你尋求幫助的地方),因爲他們的時間也很寶貴。

  2. 「'@'已經被聲明」表明你的參數被聲明爲沒有名字,所以在調試時,查看你正在使用的SQLDS並查找沒有明確命名的參數。

再次感謝所有閱讀並願意幫助的人。非常感謝。