2017-08-22 11 views
0

私はテスト用にデータベース上の偽のデータ/情報のセットを生成するこのコンソールアプリケーションを持っています。'System.ArgumentOutOfRangeException'型の例外はmscorlib.dllで発生しましたが、ユーザーコードでは処理されませんでした

public List<LCS_ExchangeDataStaging> GenerateNewData(int count) 
      { 
       var newData = new List<LCS_ExchangeDataStaging>(); 
       var random = new Random(); 
       var branches = new LCSBranchContext().GetAllBranches(); 
       var schemeIds = new LCSSchemePortfolioContext().SchemePortfolios(); 

      var branchCount = branches.Count - 1; 
      var schemeCount = schemeIds.Count - 1; 

      Parallel.For(1, count + 1, i => 
      { 
       int gender = random.Next(0, 1); 

       var data = new LCS_ExchangeDataStaging 
       { 
        AccountNumber = (3000000000 + random.Next(999999999)).ToString(), 
        AccountStatement = random.Next(), 
        Address = Faker.Address.StreetAddress(), 
        AddressOfKeyContact = Faker.Address.StreetAddress(), 
        Age = RandomDate(DateTime.Now.AddYears(-70), DateTime.Now.AddYears(-18), random), 
        AmountDisbursed = Faker.RandomNumber.Next(20000000), 
        AmountOverdue = Faker.RandomNumber.Next(1000000), 
        BranchName = branches[random.Next(branchCount)].Name, 
        ClientId = $"R{(Faker.RandomNumber.Next(99999999) + 200000000).ToString()}", 
        ClientName = gender == 0 ? NameGenerator.Generate(Gender.Male) : NameGenerator.Generate(Gender.Female), 
        CompaniesMandate = "", 
        DateOfIncorporation = RandomDate(DateTime.Now.AddYears(-70), DateTime.Now, random), 
        DaysPastDue = 1, 
        DisbursmentDate = RandomDate(DateTime.Now.AddYears(-3), DateTime.Now, random), 
        Email = Faker.Internet.Email(), 
        EmergencyContact = Faker.Name.FullName(), 
        EmployeeContact = Faker.Name.FullName(), 
        EmployeeContactTelePhone = Faker.Phone.Number(), 
        EmployerAddress = Faker.Address.StreetAddress(), 
        EmployerName = Faker.Company.Name(), 
        EmployerTelephone = Faker.Phone.Number(), 
        ExpiryDate = RandomDate(DateTime.Now.AddYears(1), DateTime.Now.AddYears(7), random), 
        FeesOverdue = Faker.RandomNumber.Next(2000), 
        Gender = gender == 0 ? "M" : "F", 
        GuarantorAddress = Faker.Address.StreetAddress(), 
        GuarantorName = Faker.Name.FullName(), 
        GuarantorTelephone = Faker.Phone.Number(), 
        Income = random.Next(50000, 1000000), 
        InsuranceCompany = Faker.Company.Name(), 
        InsuredAmount = Faker.RandomNumber.Next(2000), 
        InterestRate = random.Next(3, 24), 
        IntrducerAddress = Faker.Address.StreetAddress(), 
        IntrestOverdue = Faker.RandomNumber.Next(2000), 
        IntroducerName = Faker.Name.FullName(), 
        IntroducerTelephone = Faker.Phone.Number(), 
        KeyContactPerson = Faker.Name.FullName(), 
        LastCrAmount = Faker.RandomNumber.Next(20000), 
        LastCrDate = RandomDate(DateTime.Now.AddYears(-1), DateTime.Now, random), 
        LienAmount = Faker.RandomNumber.Next(2000), 
        LoanRestructured = "No", 
        MissedPayin24MonthCount = random.Next(0, 15), 
        MonthlyInflow = Faker.RandomNumber.Next(1000000), 
        OperativeAccountNumber = $"01{random.Next(99999999)}", 
        OutstandingPrincipal = Faker.RandomNumber.Next(200000), 
        PenalChargeDue = Faker.RandomNumber.Next(2000), 
        PrincipalOverdue = Faker.RandomNumber.Next(2000), 
        ProductCategory = "", 
        ProductType = "LAA", 
        RelationshipYears = random.Next(0, 40), 
        RepaymentAmount = Faker.RandomNumber.Next(2000), 
        ReturnedChequeIn6MonthCount = random.Next(0, 3), 
        SchemeID = schemeIds[random.Next(schemeCount)].SchemeCode, 
        Telephone1 = Faker.Phone.Number(), 
        Telephone2 = Faker.Phone.Number(), 
        TelephoneOfKeyContact = Faker.Phone.Number(), 
        Tenor = random.Next(3, 124).ToString(), 
       }; 

       newData.Add(data); 
      }); 

      return newData; 
     } 

しかし、この方法GenerateNewDataランは、私が型「System.ArgumentOutOfRangeExceptionが」の例外ががmscorlib.dllで発生したが、ユーザーコードで処理されなかった

この例外を取得するとき

追加情報: 'maxValue'はゼロより大きくする必要があります。

System.ArgumentOutOfRangeException was unhandled by user code 
    HResult=-2146233086 
    Message='maxValue' must be greater than zero. 
Parameter name: maxValue 
    ParamName=maxValue 
    Source=mscorlib 
    StackTrace: 
     at System.Random.Next(Int32 maxValue) 
     at RLCS.Tasks.Data.DataGenerator.<>c__DisplayClass1_0.<GenerateNewData>b__0(Int32 i) in C:\Users\Solution Architect\Documents\WORK\lcs\lcs\RLCS.Tasks\Data\DataGenerator.cs:line 50 
     at System.Threading.Tasks.Parallel.<>c__DisplayClass17_0`1.<ForWorker>b__1() 
    InnerException: 

この場合のご意見をお寄せください。 ありがとう

+0

「int gender = random.Next(0、1);」は、上限が排他的であるため、ゼロを生成するだけです。 'branches.Count'または' schemeIds.Count'は何時でも0ですか? – Milster

+1

これは問題を引き起こすかもしれないと思う: 'SchemeID = schemeIds [random.Next(schemeCount)]。SchemeCode'。 'schemeCount'はどこで設定しますか?エラーは明らかに何が問題なのかを示します。 'Random'オブジェクトも同様に' Faker'クラスにあるかもしれません。コードをデバッグしてみてください。 –

+0

@MichałTurczynありがとうございました。私が今修正した 'branchCount'と' schemeCount'の悪いデータのためです。 –

答えて

2

すべてのコードを実行したり表示したりするのは難しいですが、問題はrandom.Next(Int32 maxValue)への呼び出しの1つがInt32 maxValueが0以下であることです。これは次の行のいずれかに絞り込む - だから、重要な変数はbranchCountschemeCountように見える

BranchName = branches[random.Next(branchCount)].Name,

SchemeID = schemeIds[random.Next(schemeCount)].SchemeCode,

。これらはそれぞれのコンテキストメソッドの結果のCount - 1に設定されています。

は私がLCSBranchContext().GetAllBranches()またはLCSSchemePortfolioContext().SchemePortfolios()のいずれかが、我々は彼らがより多くの結果を返すことによって、「修正」することができます1または0の結果を、戻ってきていると思われるが、よりよい解決策はFaker.Random.ListItem()を使用することですし、C#6安全なナビゲーション演算子(?)このような - 提供されたリスト内のすべてのエントリが存在しない場合nullに値を設定します

BranchName = Faker.Random.ListItem(branches)?.Name,

SchemeID = Faker.Random.ListItem(schemeIds)?.SchemeCode,

+0

ありがとう@gamesmad。ただし、** Faker.Random.ListItem(ブランチ)?名前、**が認識されませんでした。エラーは、私が今ソートした 'branchCount'と' schemeCount'のヌル/ネガデータによるものです。再度、感謝します –

関連する問題