我們解決方案的一部分是使用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被解析成一個逗號分隔字符串。
您是否查看了導致錯誤的查詢生成的SQL?我會從那裏開始,並尋找使用'@'的任何地方。我的猜測是,錯誤的原因將變得相當明顯。 – Servy 2013-04-11 16:40:32
是的,我們已經查看了該頁面加載時的SQL並沒有發生任何中斷,並且在附加了Where子句之後,也沒有任何內容突破。 – user2271111 2013-04-11 16:42:25
那麼它什麼時候突破? SQL在當時的樣子是什麼樣的? – Servy 2013-04-11 16:45:36