2009-07-27 15 views
1

私はSqlDataReaderを使用してWinformアプリケーションでエンティティを設定しています。エンティティクラスには、データベースにいくつかの外部キー属性があり、エンティティクラスのプロパティとして設定します。各プロパティのタイプは「属性」でIDは& Descriptionプロパティです。複数のSQlCommand.ExecuteReaderを呼び出すか、datareader.NextResult()を使用して1回呼び出しますか?

システムのユーザーの中にはデータベースから遠いものがあるため、データアクセスのパフォーマンスが重視されます。

単一の結果セットを返すストアドプロシージャに対してSqlCommand.ExecuteReaderを複数回(属性ごとに1回)実行するか、複数の結果セットを返して使用するストアドプロシージャに対してSqlCommand.ExecuteReaderを一度実行できますSqlDataReader.NextResultを実行して属性を設定します。

私が.NextResultでループすると、ストアドプロシージャとプロパティ割り当てのループが整列されていることを確認する際に問題が発生します。 procのSELECTステートメントの順序が変更された場合、winformアプリケーションの割り当て順序が乱れてしまいます。

とにかくSqlDataReaderが読み込みごとにデータベースに戻った場合、SqlCommand.ExecuteReaderを実行すると時間がかかりますか?各属性に対してExecuteReaderを実行すると、代入側でより明確になります。

ありがとうございます!

答えて

1

.Nextresultを使用すると、ADO.Netは結果セットごとにデータベースに戻りません。このロジックはすべてADO.Netデータプロバイダにあります(データアクセスレイヤー、アプリケーションサーバー、UIレイヤーなど)。

datareaderを複数回実行すると、ただし、1回の呼び出しごとにデータベースへの移動は1回になります。したがって、このコードが実行されているレイヤーがDBから離れて(往復時間内に)離れていると、.NextResult技法を使用する方がよいでしょう。

また、データリーダーではなく複数のDataTableを使用することを検討する必要があります。

+2

私は不思議です:DataAdapterを使用するDataSetを使用するのは、DataReaderを使用するよりも「パフォーマンスが良い」ものでしょうか? DataAdapterはDataReaderを使用しているので、私は神秘的な魔法によってDataAdapterでは高速に実行されますが、ユーザーの終了コードでは実行されないと思っています。 –

+0

正直なところ、私は確かではありませんが、ADO.Netプロバイダのコードでデータセットをデータで埋めるのは最適化されている可能性があります(おそらくC++ /アセンブリで記述されています?)を使用してデータベースを切断し、データウェアハウスを使用する場合は、std CLRフレームワーククラスの呼び出しを使用して、このコードを自分で記述しなければなりません。 ... –

+0

複数のDB接続を作成する可能性のあるアプリケーションでは、スケーラビリティに何が影響するのかは接続の機能ではなく、どれくらい開いているかです。 –