2017-12-07 2 views
0

私は、指定されたコマンド文を使用して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つのクエリを書く必要があり、かなり複雑になる可能性があるので、これは素晴らしい解決策ではありません。

シンプルな解決策はありますか?

+0

単純にステートメントを実行してから、.NETのデータセット内のレコードを数えないのはなぜですか?確かに、データ転送のオーバーヘッドがありますが、それでは「ORDER BY」について心配する必要はありません。代わりに、クエリの残りを 'ORDER BY'のインデックス位置にドロップすることができます。 – gmiley

答えて

0

DataReaderを使用しているため、カウントは使用できません。クエリの進捗バーを表示していますか?その場合は、進行状況バーの代わりに、単にクエリを2回実行するのではなく、待ち時間を表示するためにユーザーが待機する時間を延長するのではなく、単に「待機」アイコンを表示することをお勧めします。

これを念頭に置いて、2つの選択肢があります。最初に、進行状況バーとSELECT COUNT(*) FROM (...);を削除してそのままクエリを渡します。その後、それを実行して結果セットを戻すときに、レコード処理のためのプログレスバーを表示する必要がある場合は、レコードを数えることができます。確かに、実際のデータを使用しない場合は、データ転送のオーバーヘッドをオペレーションに追加するという欠点があります。したがって、それほど余計な負債に値するのはあなた次第です。

あなたの2番目のオプションは、単に以下のような何かを行うことによって、任意のクエリのORDER BY部分を削除するには、次のようになります。

public string RemoveOrderBy(string query) 
{ 
    return query.SubString(0, query.IndexOf("ORDER BY")); 
} 

これは、任意のORDER BY文を取り除くだろうが、あなたはその可能性のある他のものを持っている場合上記と同じ方法でサブクエリに対処する必要があるサブクエリでは機能しません。

+0

データセットでの試行はうまくいくが、オーバーヘッドを避けようとしている。 ORDER BYをクエリから削除することはできません。なぜなら、order byが複数回使用されるクエリでは、マルチテーブルサブクエリが存在することがあるからです。 – Olli

関連する問題