0

一部の全文検索クエリ、特に複数の単語を含むクエリで奇妙な動作が発生しています。これらは、Management Studio を介して実行すると正常に動作しますが、コードから呼び出すと結果が返されません。アプリからどのコマンドが送信されているかを確認するために SQL トレースを実行しました。Management Studio から実行するとまったく同じコマンドが結果として返されますが、ExecuteReader メソッドを使用してアプリから呼び出された場合は結果が返されません。

この呼び出し:

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

このコマンドを実行すると、アプリと Management Studio の両方のデータが返されます。

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

Management Studio から実行された場合にのみデータを返します。これらのクエリをトレース ログから直接コピーして貼り付けました。

コード側では、Enterprise Library を使用していますが、全体的な DB 呼び出しは非常に単純です。

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

2 番目のケースでは、何らかの理由で dataReader.HasRows が false ですが、Management Studio からこれらのクエリを実行すると、両方ともデータが返されます。

返された行の数が原因である可能性があると思いましたが (2 番目のクエリははるかに大きな結果セットを返します)、さらに多くの行が返された単一単語検索のテストに成功しました。

DataReader が単純な Management Studio クエリの実行とは異なる動作をする理由を理解していただければ幸いです。

ありがとう、

アントニン

4

1 に答える 1

1

わかりました、これは興味深いです。もう少しデバッグを行ったところ、dataReader.HasRows プロパティが正確ではないことがわかりました。結果ビュー コレクションにデータがある場合でも、何らかの理由でこれが false に設定されることがあります。

クライアントアプリとサーバー間で転送されるデータの量にreader.HasRowsが何らかの形で依存しているかどうか疑問に思うので、大量のデータの場合、ExecuteReaderメソッドが呼び出されると、このプロパティはすぐには更新されません。

とにかく、reader.HasRows のチェックを削除するだけで、この問題は解決します。

于 2009-10-14T08:59:20.640 に答える