我们解决方案的一部分是使用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