2017-05-18 24 views
1

2つの異なるデータベースの2つのテーブルを比較し、他のテーブルから欠落しているデータを返すコンソールアプリケーションがあります。 "System.Data.SqlClient.SqlException型の未処理の例外がSystem.Data.dllで発生しました。このRPC要求には多すぎるパラメータが指定されています

追加情報:着信表形式データストリーム(TDS)リモートプロシージャコール(RPC)プロトコルストリームが正しくありません。このRPC要求には多すぎるパラメータが指定されています。最大値は2100です。

私は、パラメータ(6400)が多すぎますが、この2つのテーブルをどのように比較して不足しているデータを取得する必要があるかを知っていますか?

static void Main(string[] args) 
{ 
    using (DataClasses_LOG01DataContext log01 = new DataClasses_LOG01DataContext(ConfigurationManager.ConnectionStrings["conn_log"].ConnectionString)) 
    { 
     List<string> list = new List<string>(); 

     var l01 = log01.name_numbers 
      .Select(x => new { x.name, x.number }); 

     foreach (var item in l01) 
     { 
      list.Add(item.name.Replace(".", "") + "_" + item.number); 
     } 

     using (DataClasses_SQL01DataContext sql01 = new DataClasses_SQL01DataContext(ConfigurationManager.ConnectionStrings["conn_sql"].ConnectionString)) 
     { 
      var log = sql01.names 
       .Select(x => new { x.name }); 

      var missing = log.Where(x => !list.Contains(x.name)); 

      foreach (var item in missing) 
      { 
       string[] result = item.ToString().Split('_'); 

       Console.WriteLine("{0} {1}", result[0], result[1]); 
      } 
     } 
    } 
} 
+0

[このRPC要求ではパラメータが多すぎます。最大値は2100です.?](http://stackoverflow.com/questions/1028547/too-many-parameters-were-provided-in-this-rpc-request-the-maximum-is-2100) –

答えて

1

はここに...

public static IQueryable<List<T>> BatchesOf<T>(this IQueryable<T> source, int chunkSize) 
{ 
    return source 
     .Select((x, i) => new { Index = i, Value = x }) 
     .GroupBy(x => x.Index/chunkSize) 
     .Select(x => x.Select(v => v.Value).ToList()) 
     .ToList(); 
} 

を助けるかもしれないあなたのLINQのためのシンプルな拡張メソッドだ、簡単なバッチ処理のメカニズムを使用することを検討して...これは「バッチ」を返しますの:私はこのコードを試してみました複数のクエリを実行するために使用できるパラメータ。

static void Main(string[] args) 
{ 
    using (DataClasses_LOG01DataContext log01 = new DataClasses_LOG01DataContext(ConfigurationManager.ConnectionStrings["conn_log"].ConnectionString)) 
    { 
     var list = log01.name_numbers 
      .Select(x => x.name.Replace(".", "") + "_" + x.number)) 
      .BatchesOf(1000) 
      .ToList(); 

     using (DataClasses_SQL01DataContext sql01 = new DataClasses_SQL01DataContext(ConfigurationManager.ConnectionStrings["conn_sql"].ConnectionString)) 
     { 
      list.ForEach(batch => { 
       var log = sql01.names.Select(x => x.name); 
       var missing = log.Where(x => !batch.Contains(x.name)); 

       foreach (var item in missing) 
       { 
        string[] result = item.ToString().Split('_'); 
        Console.WriteLine("{0} {1}", result[0], result[1]); 
       } 
      }); 

     } 
    } 
} 
関連する問題