2012-02-29 50 views
1

我在我的网页上有一个下拉列表,其中的选定项目必须传递给数据库中的存储过程查询。但是,在我的绑定方法中,我在adp.Fill(ds)处遇到了一个奇怪的错误。适配器无法填充数据集中的数据:抛出异常

该例外总是说“关键字附近的语法不正确”为“。”,其中to始终是下拉选项中的第二个单词。 对于如:项目在dropdown- 9 to 5(第2个字:到),age of empires(第2个字:)的
例外:
Incorrect syntax near the keyword 'to'
Incorrect syntax near the keyword 'of'

下面是我使用的方法:

private void Bind(string ss) 
{ 
    SqlDataAdapter adp = new SqlDataAdapter("Retrieve", ConfigurationManager.ConnectionStrings["cn"].ConnectionString); 
    DataSet ds = new DataSet(); 
    adp.SelectCommand.CommandType = CommandType.StoredProcedure; 
    adp.SelectCommand.Parameters.Add("@s1", SqlDbType.NVarChar, 255).Value = ss; 
    adp.SelectCommand.Parameters.Add("@s2", SqlDbType.NVarChar, 255).Value = DropDownList1.SelectedItem.ToString(); 
    adp.Fill(ds); 
    DataList1.DataSource = ds; 
    DataList1.DataBind(); 
} 

StoredProcedure的

ALTER PROCEDURE [dbo].[Retrieve_SegmentedQ] 
(
    @s1 nvarchar(255), 
    @s2 nvarchar(255) 
) 

AS 
BEGIN 
    DECLARE @query nvarchar(max) 

    SET @query = 'SELECT DISTINCT Details from tbData WHERE Name IN (' + @s1 + ') AND UnsegmentedQuery=' + @s2 

    exec sp_executesql @query 
END 

有什么建议这里有什么不对?

+0

你能证明你的错误的屏幕截图 – 2012-02-29 08:01:12

+0

您可以在静态访问DataList控件实例方法?你一定要把它变成非静态的,这种方法甚至更多的控制。在ASP.NET中,每个控件都在页面生命周期结束时被回收,并且会在每次新请求时重新创建。通过将它们设置为静态,它们将被每个非常糟糕的请求/用户共享。顺便说一句,你在哪里打开/关闭你的连接? – 2012-02-29 08:05:17

+0

@TimSchmelter:对不起,自从我手写它以来,这是一个错字,并没有从IDE中复制。编辑方法签名。关于连接的打开和关闭:SQLDataAdapter隐含性可以做到这一点。我已经给出了连接字符串作为参数 – Cipher 2012-02-29 08:09:09

回答

2

更新像下面

ALTER PROCEDURE [dbo].[Retrieve_SegmentedQ] 
(
@s1 nvarchar(255), 
@s2 nvarchar(255) 
) 

AS 
BEGIN 
DECLARE @query nvarchar(max) 

SET @query = 'SELECT DISTINCT Details from tbData WHERE Name IN (''' + @s1 + ''') AND UnsegmentedQuery=''' + @s2 + '''' 

exec sp_executesql @query 

END 
+0

我不明白。什么是双引号。他们给我语法错误 – Cipher 2012-02-29 08:07:59

+0

它不是双引号逗号。它是多个单引号。由于您的参数是字符串,因此@查询中的最终查询应该有参数周围的单引号。例如:它应该像 SELECT DISTINCT来自tbData的详细信息名称IN('FirstParam')AND UnsegmentedQuery ='SecondParam' 这些是为了那个。 尝试打印@查询,而不是sp_executesql,你可以看到@查询里面是什么 – PraveenVenu 2012-02-29 08:11:38

+0

@PraveenMenu:我得到了你的答案的一部分意味着存储过程。此外,这是否意味着从C#传递的字符串参数应该来自:''walk','from','here''这样的逗号分隔符?做这样的事情:''Param1','Param2','Param3'给了我这个错误:'程序或函数Retrieve指定的参数太多.' – Cipher 2012-02-29 08:49:47

2

bug是这里的程序:

SET @query = 'SELECT DISTINCT Details from tbData WHERE Name IN (' + @s1 + ') AND UnsegmentedQuery=' + @s2 

你的存储过程,但使用它作为查询,因此使像SQL注入。结果您将有以下查询:

SET @query = 'SELECT DISTINCT Details from tbData WHERE Name IN (5 to 9) AND UnsegmentedQuery=age of empires 

这是错误的。 通过以下方式将单引号添加到您的参数中。

SET @query = 'SELECT DISTINCT Details from tbData WHERE Name IN (''' + @s1 + ''') AND UnsegmentedQuery=''' + @s2 + '''' 
0

命令文本的名称应该是相同的过程名....在这里,他们都是不同的