2013-04-11 99 views
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 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被解析成一个逗号分隔字符串。

+0

您是否查看了导致错误的查询生成的SQL?我会从那里开始,并寻找使用'@'的任何地方。我的猜测是,错误的原因将变得相当明显。 – Servy 2013-04-11 16:40:32

+0

是的,我们已经查看了该页面加载时的SQL并没有发生任何中断,并且在附加了Where子句之后,也没有任何内容突破。 – user2271111 2013-04-11 16:42:25

+0

那么它什么时候突破? SQL在当时的样子是什么样的? – Servy 2013-04-11 16:45:36

回答

1

我应该附和作为问题在这里监事:

OK,所以我们想出了什么事。

我们没有意识到的是SQLDataSource将我们附加的WHERE子句作为SelectParameters使用。我们希望添加到查询中的每个参数最终会提供给SQLDS,然后将它们作为SelectParameter添加,但我们并没有意识到这一点,并且因为我们没有做任何明确的参数声明,所以只添加了参数“”作为名称,导致“@”的错误已被声明“。

这整个事情最令人尴尬的部分是我们的API已经占据了参数名称,但我们无意中排除了这部分。非常感谢您阅读并尝试提供帮助。我们非常感谢您花时间帮助我们在这里集思广益。

,所以我想这整个错误的拿回家的是两个部分:

  1. 知道你的API。当你意识到自己搞砸了,感谢那些花时间在StackOverflow上帮助你的人(或者你寻求帮助的地方),因为他们的时间也很宝贵。

  2. “'@'已经被声明”表明你的参数被声明为没有名字,所以在调试时,查看你正在使用的SQLDS并查找没有明确命名的参数。

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