变量名'@'已经申报了

本文关键字:变量名 | 更新日期: 2023-09-27 18:08:36

我们的解决方案的一部分是使用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#组装了查询,我们将此查询应用于SqlDataSource作为Select Command。然而,我们最近发现了一个非常奇怪的SQL错误,我们以前从未见过:

错误:

"The variable name '@' has already been declared

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

我们没有在SQL中声明任何变量。如上所述,唯一的输入参数来自Querystring,在构建SQL查询时,我们在ASP端使用ASP:SqlDataSource中的QueryStringParameters和c#端使用"int.Parse(Request.QueryString["id"]).ToString()"来访问该参数。

在研究了这个错误之后,我还没有找到变量声明为空的实例。大多数人在两次声明变量(如'@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被解析为逗号分隔的字符串

变量名'@'已经申报了

我应该以主管的身份插话:

好的,所以我们知道发生了什么。

我们没有意识到的是,SQLDataSource正在接受我们附加的WHERE子句,并将它们用作SelectParameters。我们想要添加到最终将提供SQLDS的查询中的每个参数都被添加为SelectParameter,而我们没有意识到这一点,并且由于我们没有进行任何显式的参数声明,因此添加的参数仅以"作为名称,从而导致错误"'@'已经被声明"。

整个事情中最尴尬的部分是我们的API已经考虑了参数名称,但我们无意中排除了这部分。非常感谢大家的阅读和帮助。我们非常感谢你在这里花时间帮助我们集思广益我们的解决方案。

所以我认为这整个错误的关键在于两部分:

  1. 了解你的API。当你意识到是你自己把事情搞砸的时候,慷慨地感谢那些花时间在StackOverflow上帮助你的人(或者任何你寻求帮助的地方),因为他们的时间也很宝贵。

  2. "'@' is already declarations "表示声明的参数没有名称,因此在调试时,请查看正在使用的SQLDS,找出没有显式命名的参数。

再次感谢所有阅读并提供帮助的人。非常感谢。