私は、指定されたコマンド文を使用してdatareaderを実行し、リーダから返されるすべてのデータレコードに対して特定のアクションを呼び出します。クエリのレコード数を取得するためのサブクエリでのバイパスの順序
データプレイヤーはフォワード専用のリーダーなので、データプレイヤーから行数を取得することはできません。進捗バーを起動するには、データウェアハウスが返すレコードの数を知る必要があります。
私の現在の試みは、次のようになります。
protected void RunConversion(string commandText, Action<IDataRecord> actionConversion)
{
try
{
var curIndex = 0;
var maxIndex = this.Source.ExecuteScalar<int?>($"SELECT COUNT(*) FROM ({commandText}) AS QUERY"); //Here i try to get the count of rows from the result
OnProgress?.Invoke(0);
foreach (var dataRecord in this.Source.ExecuteReader(commandText))
{
try
{
actionConversion?.Invoke(dataRecord);
}
catch (Exception e)
{
OnReport?.Invoke($"Error: {e}{Environment.NewLine}");
}
finally
{
OnProgress?.Invoke((int)((double)++curIndex/maxIndex * 100f));
}
}
}
catch (Exception e)
{
OnReport?.Invoke($"Fatal Error: {e}{Environment.NewLine}");
OnProgress?.Invoke(100);
}
}
問題は、ある時々CommandTextを、パラメータがサブクエリでは許可されていないことで、トップ順序を使用せずにすることにより...順序を含むクエリが含まれています。
もう1つの試みは、現在のcommandText-Parameterの結果のみをカウントするクエリであるthridパラメータを提供することです。私は2つのクエリを書く必要があり、かなり複雑になる可能性があるので、これは素晴らしい解決策ではありません。
シンプルな解決策はありますか?
単純にステートメントを実行してから、.NETのデータセット内のレコードを数えないのはなぜですか?確かに、データ転送のオーバーヘッドがありますが、それでは「ORDER BY」について心配する必要はありません。代わりに、クエリの残りを 'ORDER BY'のインデックス位置にドロップすることができます。 – gmiley