变量名'@'已经声明

bquia 发布于 2019-03-09 asp.net 最后更新 2019-03-09 14:40 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 declaredVariable 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被解析成逗号分隔的字符串。
已邀请:

lquia

赞同来自:

我应该在这里作为主管问候: 好的,我们弄清楚发生了什么。 我们没有意识到的是SQLDataSource正在使用我们附加的WHERE子句并将它们用作SelectParameters。我们想要添加到最终提供SQLDS的查询的每个参数然后被添加为SelectParameter而我们没有意识到它,并且因为我们没有进行任何显式参数声明,所以参数只添加了“”作为名称,导致“'@'错误已经被宣布”。 整个事情中最令人尴尬的部分是我们的API已经考虑了参数名称,但我们无意中排除了这部分。非常感谢大家的阅读和尝试帮助。我们非常感谢您花时间帮助我们在这里集思广益。 所以我想这整个错误的实现分为两部分:

  1. 了解您的API。当你意识到你自己搞砸了时,慷慨地感谢那些花时间在StackOverflow(或者你寻求帮助的地方)帮助你的人,因为他们的时间也是有价值的。
  2. “'@'已经被声明”表示你的参数被声明没有名字,所以在调试时,查看你正在使用的SQLDS,找到任何未明确命名的参数。
再次感谢所有阅读并提供帮助的人。非常感谢。