2012-03-31 96 views
0

我试图在我的数据库中的表中进行搜索,它返回的顶端50行的名字像搜索词被传递给函数,但它总是返回相同的50个结果SQL始终返回相同的结果

我的SQL是这样的:

Select TOP(50) * 
FROM [database].[dbo].[records] 
WHERE (A_1STNAME LIKE '" + @searchTerm + "%') 
ORDER BY A_RECID 

当我运行在视觉工作室查询窗口此查询,它工作正常,但是当我通过我的ASP.NET应用程序运行它,它总是返回相同的50结果,并且只有其中一个名字接近我传递给它的searchTerm。

这里是运行功能的页面代码:

protected void Page_Load(object sender, EventArgs e) 
{ 

     _migrated_data data = new _migrated_data(); 
     DataSet ds = data.Search(Request.QueryString.Get("query"), "A_RECID", 50); 
     if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0) 
     { 
      rpt_Data.DataSource = ds.Tables[0].DefaultView; 
      rpt_Data.DataBind(); 
     } 

} 

,这里是_migrated_data的搜索方法:

public DataSet Search(String @pSearchTerm, String @pSortBy, int @pRowCount) 
{ 
    DataSet ds = new DataSet(); 
    OleDbConnection objOleDBConn; 
    OleDbDataAdapter objOleDBDa; 
    objOleDBConn = new OleDbConnection(ClearingHouse_OLEDDB); 
    objOleDBConn.Open(); 
    string lSQL = "SELECT TOP(50) * FROM [database].[dbo].[records]"; 
    lSQL += " WHERE (A_1STNAME LIKE @searchTerm) ORDER BY @sortBy"; 
    SqlCommand t = new SqlCommand(lSQL); 

    if (pSearchTerm != null && pSearchTerm != "") 
    { 
     t.Parameters.AddWithValue("@searchTerm", @pSearchTerm + "%"); 
    } 

    if (pSortBy != null && pSortBy != "") 
    { 
     t.Parameters.AddWithValue("@sortBy", @pSortBy); 
    } 
    else 
    { 
     t.Parameters.AddWithValue("@sortBy", "A_RECID"); 
    } 
    objOleDBDa = new OleDbDataAdapter(t.CommandText, objOleDBConn); 
    objOleDBDa.SelectCommand.CommandType = CommandType.Text; 
    objOleDBDa.Fill(ds); 
    objOleDBConn.Close(); 
    return ds; 
} 

使用当地人查看T的最后的CommandText,我得到的上面给出的sql结果。

任何帮助是极大的appriciated :)

+0

你确定你的应用程序通过了有效的SQL吗?我的意思是你使用SqlCommand.Parameters.Add(... – rkosegi 2012-03-31 15:00:08

+0

你确定搜索词没有被硬编码在你的asp页面的某个地方吗? – 2012-03-31 15:01:41

+1

还要注意你的当前sql是开放给sql注入的,因为你拥有它。应该像@rkosegi建议的那样将搜索项作为参数传递给我 – 2012-03-31 15:02:46

回答

0

AS罗布·罗迪说,首先,得到的结果与价值的游戏内需要%焦炭在千卡的末尾:

Select TOP(50) * 
FROM [database].[dbo].[records] 
WHERE (A_1STNAME LIKE '" + @searchTerm + "%') 
ORDER BY A_RECID 

二,可能是你的searchTerm是空的,所以它的抓住总是相同的结果。

调试你的应用程序,并观察变量,看看它是否收到一些价值。

+0

'''正是这个问题。另外,在@searchTerm后面添加另一个'%'符号将匹配更大量的记录秒。 – 2012-03-31 15:12:43

+0

糟糕...为了匹配所有的开始与''%'必须在最后。我已经纠正了答案。 – rcdmk 2012-03-31 15:18:53

+0

对不起,我在原始文章中留下了%,但它是在我的代码中,我现在修复了它。 – CaffeinatedCM 2012-03-31 15:31:18

0

你有没有SQL注入。此外,它看起来像%-signs丢失。

事实上,查询在查询窗口中工作,而不是在您的应用程序中意味着错误不在您的查询中!你有想过吗?可能你应该发布ASP.NET应用程序的代码。

+0

谢谢,我发布了我的ASP.NET代码,建议如下。 – CaffeinatedCM 2012-03-31 15:33:41

0

这听起来像你的参数没有正确传递到你的数据层。最简单的方法是找到Sql Profiler并检查它是否被传递。如果是这样,你的sql的责任。如果不是,那是你的应用程序。然后,您可以在您的应用程序上使用调试器,以便在堆栈中查找问题所在。