变量名'@'已经声明

时间:2013-04-11 16:37:25

标签: c# asp.net sql-server

我们的部分解决方案是使用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,我们使用ASP端的QueryStringParametersASP:SqlDataSource上的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解析为逗号分隔的字符串。

1 个答案:

答案 0 :(得分:1)

我应该在这里担任主管:

好的,我们弄清楚发生了什么。

我们没有意识到SQLDataSource正在使用我们附加的WHERE子句并将它们用作SelectParameters。我们想要添加到最终提供SQLDS的查询的每个参数然后被添加为SelectParameter而我们没有意识到它,并且因为我们没有做出任何显式参数声明,所以参数只添加了“”作为名称,导致错误“'@'已经宣布”。

这件事最令人尴尬的部分是我们的API已经考虑了参数名称,但我们无意中排除了这部分。非常感谢大家的阅读和尝试帮助。我们非常感谢您花时间帮助我们在这里集思广益。

所以我认为整个错误的实现分为两部分:

  1. 了解您的API。当你意识到你自己搞砸了,慷慨地感谢那些花时间在StackOverflow(或者你寻求帮助的地方)帮助你的人,因为他们的时间也是有价值的。

  2. “'@'已经声明”表示你声明的参数没有名称,所以在调试时,查看你正在使用的SQLDS,找到任何未明确命名的参数。 / p>

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