2009-10-13 6 views
0

Je rencontre un comportement bizarre avec certaines requêtes de recherche en texte intégral, en particulier celles comportant plusieurs mots. Ils fonctionnent correctement lorsqu'ils sont exécutés via Management Studio mais ne retournent aucun résultat lorsqu'ils sont appelés à partir d'un code. J'ai fait un SQL Trace pour voir quelles commandes sont envoyées depuis mon application et exactement la même commande vient avec les résultats lorsqu'elle est exécutée à partir de Management Studio mais ne donne aucun résultat lorsqu'elle est appelée depuis mon application en utilisant la méthode ExecuteReader.Aucun résultat n'a été renvoyé à un lecteur mais la même requête fonctionne via SQL Management Studio

Cet appel:

exec dbo.FullTextSearch_Articles @ftsQuery=N' FORMSOF (INFLECTIONAL, moravec) ' 

renvoie les données correspondant à la fois mon application et Management Studio alors que cette commande:

exec dbo.FullTextSearch_Articles @ftsQuery=N'(FORMSOF (INFLECTIONAL, jan) AND FORMSOF (INFLECTIONAL, moravec))' 

ne fera que renvoyer des données lors de l'exécution de Management Studio. J'ai copié/collé ces requêtes directement à partir d'un journal de suivi.

Sur un côté de code, j'utilise Enterprise Library, mais dans l'ensemble mon appel DB est très simple:

using (var dataReader = (SqlDataReader)db.ExecuteReader(cmd)) 
{ 
    if (dataReader.HasRows) 
    { 
     var results = new List<IFullTextSearchItem>(); 
     while (dataReader.Read()) 
     { 
      results.Add(CreateArticleSearchFromReader(dataReader)); 
     } 
     return results; 
    } 
    return null; 
} 

Dans le second cas, dataReader.HasRows est faux pour une raison quelconque, mais encore une fois, quand ces requêtes sont exécutées à partir d'un Management Studio, les deux retournent des données. Je pensais que cela pouvait être dû à un certain nombre de lignes retournées (la deuxième requête renvoie un ensemble de résultats beaucoup plus grand), mais ensuite testé avec succès la recherche par mot unique avec encore plus de lignes retournées.

Une idée de la différence entre DataReader et une simple exécution de requête de Management Studio serait appréciée.

Merci,

Antonin

+0

Etes-vous sûr que vous n'avez aucun faux SELECT dans le TSQL? c'est-à-dire que la première grille est celle que vous recherchez? Peut-être qu'il y a un 'SELECT' vide (débogage) quelque part? –

Répondre

1

OK, ce qui est intéressant. J'ai fait un peu plus de débogage et j'ai trouvé que la propriété dataReader.HasRows n'est pas précise - pour une raison quelconque, elle est définie sur false dans certains cas, même s'il y a des données dans la collection Results View.

Je me demande si reader.HasRows est en quelque sorte fiable sur la quantité de données transférées entre l'application client et serveur - donc dans le cas de beaucoup des données, cette propriété ne sont pas immédiatement mis à jour une fois ExecuteReader est appelée. De toute façon, simplement en supprimant vérifier pour lecteur.HasRows résout ce problème.