我正在尝试在我的数据库中的一个表上进行搜索,在该表中它返回前50行,其中第一个名称就像传递给函数的搜索词一样,但它总是返回相同的50个结果
我的sql看起来像这样:
Select TOP(50) *
FROM [database].[dbo].[records]
WHERE (A_1STNAME LIKE '" + @searchTerm + "%')
ORDER BY A_RECID
当我在Visual Studios查询窗口中运行此查询时,它按预期工作,但是当我通过我的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;
}
使用locals查看t的最终CommandText,我得到上面给出的sql结果。
任何帮助都很受欢迎:)
答案 0 :(得分:0)
你正在那里注入SQL。此外,看起来%-signs缺失了。
事实上,查询在查询窗口中而不是在您的应用程序中工作意味着错误不在您的查询中!你有没有想过这个?您可能应该发布ASP.NET应用程序的代码。
答案 1 :(得分:0)
听起来您的参数未正确传递到数据层。找出是否是这种情况的最简单方法是打开Sql Profiler并检查它是否正在通过。如果是的话,你的sql应该受到指责。如果不是,那就是你的申请。然后,您可以在应用程序上使用调试器,以便在堆栈中查找问题所在。
答案 2 :(得分:0)
AS Rob Rodi说,首先,为了得到一个值得开始的结果,你需要%
char在结束时:
Select TOP(50) *
FROM [database].[dbo].[records]
WHERE (A_1STNAME LIKE '" + @searchTerm + "%')
ORDER BY A_RECID
其次,可能你的searchTerm
是空的,所以它总是抓住相同的结果。
调试您的应用并观察变量以查看它是否正在接收某些值。