2012-03-31 2 views
0

J'essaie de faire une recherche sur une table dans ma base de données où il renvoie les 50 premières lignes avec un prénom comme le terme de recherche étant passé à la fonction, mais son retour toujours les mêmes 50 résultatsSQL toujours retourner les mêmes résultats

mon sql ressemble à ceci:

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

quand je lance cette requête dans la fenêtre de requête de Visual Studios, il fonctionne comme prévu, mais quand je le lance dans mon application ASP.NET, il renvoie toujours le même 50 résultats, et un seul d'entre eux a un prénom proche de la recherche que je lui ai passé.

est ici le code de page qui exécute la fonction:

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(); 
     } 

} 

et voici la méthode de recherche de _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; 
} 

Utiliser locals pour voir la CommandText finale de t, je reçois la résultats sql j'ai donné ci-dessus.

Toute aide est grandement appriciated :)

+0

Etes-vous sûr que votre application a passé un SQL valide? Je veux dire, avez-vous utilisé SqlCommand.Parameters.Add (... – rkosegi

+0

Etes-vous sûr que le terme recherché n'est pas codé en dur quelque part dans votre page ASP? –

+1

Notez également que votre SQL actuel est ouvert à l'injection SQL comme vous l'avez. devrait passer le terme de recherche comme un paremeter comme le suggère @rkosegi –

Répondre

0

AS Rob Rodi dit, tout d'abord, pour obtenir les résultats commançant avec une valeur que vous aurez besoin % omble chevalier à la fin de l'therm:

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

Deuxièmement, probablement votre searchTerm est vide, il est donc saisir toujours les mêmes résultats.

Déboguez votre application et regardez la variable pour voir si elle reçoit une certaine valeur.

+0

le '%' est également le problème.En outre, l'ajout d'un autre symbole '%' après '@ searchTerm' correspondra à une plus grande quantité d'enregistrements s. –

+0

Oups ... Pour correspondre à tout début de therm, le% doit être à la fin. J'ai corrigé la réponse. – rcdmk

+0

désolé, j'ai laissé le% dans mon message original mais c'était dans mon code, je l'ai réparé maintenant. – CaffeinatedCM

0

que vous rencontrez là injection SQL. En outre, il semble que les signes% sont manquants.

Le fait que la requête fonctionne dans une fenêtre de requête et non dans votre application signifie que l'erreur ne se trouve pas dans votre requête! Avez-vous pensé à ça? Probablement, vous devez publier le code de votre application ASP.NET.

+0

merci, j'ai posté mon code ASP.NET comme suggéré – CaffeinatedCM

0

Il semble que votre paramètre ne soit pas transmis correctement à votre couche de données. Le moyen le plus simple de savoir si c'est le cas est d'activer Sql Profiler et de vérifier s'il est transmis. Si c'est le cas, votre SQL est à blâmer. Si ce n'est pas le cas, c'est votre application. Vous pouvez ensuite utiliser le débogueur de votre application pour remonter la pile et voir où se situe le problème.

Questions connexes