Requête de text intégral SQL – se comporte différemment selon comment j'appelle une procédure stockée

J'ai rencontré un problème confus.

J'ai une procédure stockée dans ma database SQL Server 2008 R2 qui prend un seul paramètre @Query et exécute une requête simple de search de text intégral:

 CREATE PROCEDURE dbo.SearchMyTable @Query varchar(250) AS SELECT ... FROM ... INNER JOIN FREETEXTTABLE (t, *, @Query) ft ON ( t.Id = ft.[Key] ) ORDER BY ft.Rank DESC 

Lorsque j'ouvre une window de requête dans SQL Server Management Studio et que je la teste en tapant:

 SearchMyTable 'truck' 

Cela fonctionne très bien.

Lorsque je tape ce qui suit, cela fonctionne toujours et renvoie les mêmes résultats (sans doute en ignorant le mot de bruit ' a ')

 SearchMyTable 'a truck' 

Mais ensuite j'ai pris dans une page ASP.NET.

 private SqlDataReader DoQuery(SqlConnection connection, ssortingng query) { SqlParameter parameter = new SqlParameter("Query", SqlDbType.VarChar); parameter.Value = query; SqlCommand command = connection.CreateCommand(); command.CommandType = CommandType.StoredProcedure; command.CommandText = "SearchMyTable"; command.Parameters.Add(parameter); return command.ExecuteReader(); } 

Quand j'appelle DoQuery(connection, "truck"); cela fonctionne, et obtient les mêmes résultats encore, que je formate et imprime sur ma page.

Mais quand je fais la deuxième version avec le mot de bruit, DoQuery(connection, "a truck"); , le SqlDataReader revient vide avec aucune ligne!

Je suis très confus. Je suppose que ma procédure stockée est correcte, car elle fonctionne lorsque vous l'appelez directement à partir d'une window de requête dans SQL Management Studio.

Alors pourquoi semble-t-il get des résultats différents selon que je l'appelle une requête brute ou via le fournisseur SQL Server ADO.NET dans ma page ASP.NET? Est-ce que je manque quelque chose?

EDIT: Il semblerait qu'il n'y a rien de mal à ce qui précède. J'ai trouvé une solution, qui peut même être un bug dans SQL / .NET. Voir ma réponse ci-dessous.

Trouvé une solution.

Le code que je n'ai pas montré était comment j'ai lu mon lecteur de données dans ma page ASP.NET:

 if (dr.HasRows) { ... while (dr.Read()) { ... } ... } else { // no results ... } 

Il s'est avéré que dr.HasRows revenait false , même s'il y avait des rangées! Cela ne m'est jamais arrivé auparavant dans 10 ans d'expérience ADO.NET.

Alors je l'ai changé pour:

 if (dr.Read()) { ... do { ... } while (dr.Read()); ... } else { // no results ... } 

Et il fonctionne.

Essayez d'exécuter SQL Server Profiler pour voir ce que SQL exécute réellement lorsqu'il est exécuté à partir du code.