0

데이터 테이블로 저장된 일련의 루프 및 데이터베이스 호출 (Select 문만)을 통해 값이있는 .txt 파일을 생성 중입니다. 그것은 잠시 동안 (19 행 ... 19 전체 루프 사이클) connection.Open()에 의해 던져지고 런타임 예외가 발생합니다.System.Data.OleDb.OleDbException (0x80004005) : 지정되지 않은 오류

내가 catch 블록 안에 전체 루프를 잡으려고 예외 및 메시지를 생성 한 다음 2 빈 줄을 스택 추적합니다. enter image description here

나는 이것을 읽으려고 노력했지만 무엇을 해야할지 알아 냈다.하지만 나는 DB 연결에 관해서는 약간 초보자이다. 나는 다른 곳을 보았지만 내 상황에 맞는 질문을 찾지 못하는 것 같습니다. 참고로

: C# 4.0 윈도우 폼 응용 프로그램, 액세스 DB

내가 찾고 시작 위치에 대한 몇 가지 제안을 찾으려하고있다.

internal IDbConnection GetConnection() 
    { 
     try 
     { 
      var connection = _assemblyProvider.Factory.CreateConnection(); 
      connection.ConnectionString = _connectionString; 
      _connectionState = connection.State.ToString(); 
      if (_connectionState == "Open") 
       GetConnection(); 
      else 
      { 
       connection.Open(); 
      } 
      return connection; 
     } 
     catch (Exception exept) 
     { 
      throw new Exception(exept.ToString() + "\n\n" + exept.StackTrace.ToString()); 
     } 
    } 

이 방법은 여기에서 호출되는 :

public DataTable ExecuteDataTable(string commandText, string tableName, DbParameterCollection paramCollection, CommandType commandType) 
    { 
     DataTable dtReturn; 
     IDbConnection connection = null; 
     try 
     { 
      connection = _connectionManager.GetConnection(); 
      dtReturn = _dbAdapterManager.GetDataTable(commandText, paramCollection, connection, tableName, commandType); 
     } 
     finally 
     { 
      if (connection != null) 
      { 
       connection.Close(); 
       connection.Dispose(); 
      } 

     } 
     return dtReturn; 
    } 

public DataTable ExecuteDataTable(string commandText, string tableName, CommandType commandType) 
    { 
     return ExecuteDataTable(commandText, tableName, new DbParameterCollection(), commandType); 
    } 

public DataTable ExecuteDataTable(string commandText) 
    { 
     return ExecuteDataTable(commandText, string.Empty, CommandType.Text); 
    } 

//read from DB using a SQL statement and return a DataTable 
    internal static DataTable readDB(string SQL) 
    { 
     var dbHelper = new DbHelper(); 

     using (IDbConnection connection = dbHelper.GetConnObject()) 
     { 
      return dbHelper.ExecuteDataTable(SQL); 
     } 
    } 
을 다음과 같이 나는 때문에 내가 구현 검증에 내 연결이 오류가 발생하면 닫혀 긍정적이다

여기에 루프가 있습니다 (다소 길고 아마도 더 잘 수행 될 수 있지만 그 이유는 여러 번 작동 한 후 깨는 이유를 찾고 싶습니다)

예외가 읽어 줄에서 발생합니다 : 나는 그것을 폐쇄하기 전에 연결이 3 번을 열려고하는 것을 실현 코드에 깊게 살펴본 후

SQLString = "SELECT * FROM Claim WHERE ClaimStatus <> 1"; 
DataTable allRecsFromClaimNotStatus1 = dbConnect.readDB(SQLString); 

if (allRecsFromClaimNotStatus1.Rows.Count == 0) 
    return; 
else 
{ 
    string path = txtExtractFileLocation.Text; 

    if (txtExtractFileLocation.Text.Substring(txtExtractFileLocation.Text.Length - 2) == "\\\\") 
    { 
     path = path.Substring(0, path.Length - 1); 
    } 

    if (path.Substring(path.Length - 1) == "\\") 
     path += "DI_Extract.txt"; 
    else 
     path += @"\DI_Extract.txt"; 

    using (StreamWriter sw = new StreamWriter(@path)) 
    { 
     for (int i = 0; i < allRecsFromClaimNotStatus1.Rows.Count; i++) 
     { 
      rNum = allRecsFromClaimNotStatus1.Rows[i][2].ToString().Trim();//Claim.InsuredRecNum 
      SQLString = "SELECT * FROM Insured WHERE RecNum = " + rNum; 
      DataTable allInsuredByRecNum = dbConnect.readDB(SQLString); 

      lossDate = allRecsFromClaimNotStatus1.Rows[i][11].ToString().Trim();//Claim.LossDate 
      lossDate = (Convert.ToDateTime(lossDate)).Date.ToString("MM/dd/yyyy"); 
      reportedDate = allRecsFromClaimNotStatus1.Rows[i][9].ToString().Trim();//Claim.ReportedDate 
      reportedDate = (Convert.ToDateTime(reportedDate)).Date.ToString("MM/dd/yyyy"); 
      claim = allRecsFromClaimNotStatus1.Rows[i][0].ToString().Trim();//Claim.ClaimNumber 

      if (chkIncludePaymentsForCurrentMonth.Checked == true) 
      { 
       direct = allRecsFromClaimNotStatus1.Rows[i][4].ToString().Trim();//Claim.DirectReserve 
       WP = allRecsFromClaimNotStatus1.Rows[i][5].ToString().Trim();//Claim.WPReserve 
       ceded = allRecsFromClaimNotStatus1.Rows[i][6].ToString().Trim();//Claim.CededReserve 
      } 
      else 
      { 
       direct = allRecsFromClaimNotStatus1.Rows[i][29].ToString().Trim();//Claim.MonthEndDirect 
       WP = allRecsFromClaimNotStatus1.Rows[i][30].ToString().Trim();//Claim.MonthEndWP 
       ceded = allRecsFromClaimNotStatus1.Rows[i][31].ToString().Trim();//Claim.MonthEndCeded 
      } 

      ced = Convert.ToDecimal(ceded); 
      wav = Convert.ToDecimal(WP); 
      ceded = ced.ToString("#.##"); 
      WP = wav.ToString("#.##"); 

      if (ceded == "") 
       ceded = "0"; 

      if (WP == "") 
       WP = "0"; 

      if ((allRecsFromClaimNotStatus1.Rows[i][10].ToString().Trim() != null) && 
          (allRecsFromClaimNotStatus1.Rows[i][10].ToString().Trim() != ""))//Claim.WaiverDate 
      { 
       onWaiver = "YES"; 
      } 
      else 
      { 
       onWaiver = "NO"; 
      } 
      reinsPreNotice = "NO"; 
      reinsCeded = "NO"; 

      switch (allRecsFromClaimNotStatus1.Rows[i][7].ToString().Trim())//Claim.CededPre 
      { 
       case "1": 
       { 
        reinsPreNotice = "YES"; 
        break; 
       } 
       case "2": 
       { 
        reinsCeded = "YES"; 
        break; 
       } 
      }//end switch 

      state = allRecsFromClaimNotStatus1.Rows[i][8].ToString().Trim();//Claim.LossState 


      lName = allInsuredByRecNum.Rows[0][1].ToString().Trim();//Insured.LastName 
      fName = allInsuredByRecNum.Rows[0][0].ToString().Trim();//Insured.FirstName 
      mi = allInsuredByRecNum.Rows[0][2].ToString().Trim();//Insured.MI 
      policy = allInsuredByRecNum.Rows[0][43].ToString().Trim();//Insured.PolicyNumber 
      DOB = allInsuredByRecNum.Rows[0][10].ToString().Trim();//Insured.DOB 
      DOB = (Convert.ToDateTime(DOB)).Date.ToString("MM/dd/yyyy"); 
      age = allInsuredByRecNum.Rows[0][11].ToString().Trim();//Insured.TrueAge 
      issueAge = calculateAge(Convert.ToDateTime(allInsuredByRecNum.Rows[0][10].ToString().Trim()), //Insured.DOB 
               Convert.ToDateTime(allInsuredByRecNum.Rows[0][45].ToString().Trim()));//Insured.EffectiveDate 

      SQLString = "SELECT InsuredRecNum, RecNum FROM Claim WHERE InsuredRecNum = " + rNum; 
      DataTable iRecNum2ClaimRecNumFromClaim = dbConnect.readDB(SQLString); 
      rNum = iRecNum2ClaimRecNumFromClaim.Rows[0][1].ToString().Trim(); 

      issueDate = allInsuredByRecNum.Rows[0][45].ToString().Trim();//Insured.EffectiveDate 
      issueDate = (Convert.ToDateTime(issueDate)).Date.ToString("MM/dd/yyyy"); 
      sex = allInsuredByRecNum.Rows[0][13].ToString().Trim();//Insured.Gender 
      planCode = allInsuredByRecNum.Rows[0][44].ToString().Trim();//Insured.PlanMnemonic 
      issueAmt = allInsuredByRecNum.Rows[0][49].ToString().Trim();//Insured.BenefitAmount (Monthly Benefit Amount before Offset) 
      benefitPeriod = allInsuredByRecNum.Rows[0][50].ToString().Trim();//Insured.BenefitPeriod 

      if (allInsuredByRecNum.Rows[0][54].ToString().Trim().Length == 2)//Insured.EliminationPeriod 
       eliminationPeriod = "0" + allInsuredByRecNum.Rows[0][54].ToString().Trim(); 
      else 
       eliminationPeriod = allInsuredByRecNum.Rows[0][54].ToString().Trim(); 

      premiumAmount = allInsuredByRecNum.Rows[0][48].ToString().Trim();//Insured.AnnualPremium 
      occupationClass = allInsuredByRecNum.Rows[0][55].ToString().Trim();//Insured.OccupationClass 

      //select only status = EXEC (0) 
      SQLString = "SELECT * FROM Offset WHERE ClaimRecNum = " + rNum + " AND Status = 0"; 
      DataTable allOffsetByClaimRecNumAndStatus0 = dbConnect.readDB(SQLString); 
      offsetAmt = 0; 
      dblSTDOffsetAmount = 0; 
      dblRecOffsetAmount = 0; 
      RECOffsetOcc = "0"; 
      RECOffsetExecuted = "0"; 
      int offsetCount = allOffsetByClaimRecNumAndStatus0.Rows.Count; 
      if (offsetCount != 0) 
      { 
       for (int j = 0; j < offsetCount; j++) 
       { 
        //accumulate standard offset (STD) and Recovery offset (REC) 
        if (allOffsetByClaimRecNumAndStatus0.Rows[0][1].ToString().Trim() == "0")//Offset.Type 
        { 
         //Standard Type 
         dblSTDOffsetAmount += Convert.ToDouble(allOffsetByClaimRecNumAndStatus0.Rows[j][4].ToString().Trim());//Offset.Amount 
        } 
        else 
        { 
         //Recovery type 
         dblRecOffsetAmount = Convert.ToDouble(allOffsetByClaimRecNumAndStatus0.Rows[j][4].ToString().Trim());//Offset.Amount 
         RECOffsetOcc = allOffsetByClaimRecNumAndStatus0.Rows[j][5].ToString().Trim();//Offset.Occurance 
         RECOffsetExecuted = allOffsetByClaimRecNumAndStatus0.Rows[j][6].ToString().Trim();//Offset.Executed 

        }//end if 
       }//end for loop 
      }//end if 

      STDOffsetAmount = dblSTDOffsetAmount.ToString(); 
      RECOffsetAmount = dblRecOffsetAmount.ToString(); 
      if (chkIncludePaymentsForCurrentMonth.Checked == true) 
       SQLString = "SELECT * FROM Payment WHERE InsuredRecNum = " + rNum + " AND IssueDate >= #01/01/" + DateTime.Today.Date.Year + "# AND IssueDate <= #" + DateTime.Today.Date.ToShortDateString() + "#"; 
      else 
       SQLString = "SELECT * FROM Payment WHERE InsuredRecNum = " + rNum + " AND IssueDate >= #01/01/" + endDate.Substring(endDate.Length - 4) + "# AND IssueDate <= #" + Convert.ToDateTime(endDate).Date.ToShortDateString() + "#"; 

      DataTable allPaymentByIRecNumAndIssDateInRange = dbConnect.readDB(SQLString); 

      YTDPmt = 0; 
      if (allPaymentByIRecNumAndIssDateInRange.Rows.Count == 0) 
       YTDPmt = 0; 
      else 
      { 
       int paymentCount = allPaymentByIRecNumAndIssDateInRange.Rows.Count; 
       double issAmt; 
       for (int k = 0; k < paymentCount; k++) 
       { 
        issAmt = Convert.ToDouble(allPaymentByIRecNumAndIssDateInRange.Rows[0][30].ToString().Trim());//Payment.IssueAmount 
        YTDPmt += issAmt; 
       }// end loop 
      }//end if 

      YTDPmts = YTDPmt.ToString(); 

      if (chkIncludePaymentsForCurrentMonth.Checked == true) 
       SQLString = "SELECT * FROM Payment WHERE ClaimRecNum = " + rNum; 
      else 
       SQLString = "SELECT * FROM Payment WHERE ClaimRecNum = " + rNum + " AND IssueDate <= #" + Convert.ToDateTime(endDate).Date.ToShortDateString() + "#"; 

      DataTable allPaymentByRNum = dbConnect.readDB(SQLString); 
      totalPmt = 0; 

      if (allPaymentByRNum.Rows.Count == 0) 
       totalPmt = 0; 
      else 
      { 
       double issAmt = Convert.ToDouble(allPaymentByRNum.Rows[0][30].ToString().Trim()); 
       for (int m = 0; m < allPaymentByRNum.Rows.Count; m++) 
       { 
        totalPmt += issAmt; 
       } 
      } 

      allPmts = totalPmt.ToString(); 

      //set spacing for output 
      string block1 = policy + claim + planCode; 
      block1 = setSpacing(block1, 28); 
      string block2 = setSpacing(benefitPeriod, 3) + eliminationPeriod + occupationClass; 
      block2 = setSpacing(block2, 11); 
      issueAmt = setSpacing(issueAmt, 8); 

      STDOffsetAmount = setSpacing(STDOffsetAmount, 8); 

      RECOffsetAmount = setSpacing(RECOffsetAmount, 8); 

      RECOffsetOcc = setSpacing(RECOffsetOcc, 3); 

      RECOffsetExecuted = setSpacing(RECOffsetExecuted, 3); 

      string block3 = lossDate + age; 
      block3 = setSpacing(block3, 13); 

      issueAge = setSpacing(issueAge, 3); 

      string block4 = issueDate + DOB + sex + onWaiver + premiumAmount; 
      block4 = setSpacing(block4, 32); 

      reinsPreNotice = setSpacing(reinsPreNotice, 3); 
      reinsCeded = setSpacing(reinsCeded, 4); 

      double ap = Convert.ToDouble(allPmts); 
      allPmts = ap.ToString("#.#"); 
      allPmts = setSpacing(allPmts, 8); 
      YTDPmts = setSpacing(YTDPmts, 8); 

      lName = setSpacing(lName, 19); 
      fName = fName + " " + mi; 
      fName = setSpacing(fName, 20); 

      string block5 = state + direct; 
      block5 = setSpacing(block5, 10); 

      ceded = setSpacing(ceded, 8); 

      WP = setSpacing(WP, 8); 

      reportedDate = setSpacing(reportedDate, 10); 

      //save row data for text file 
      dataOutput = (block1 + block2 + issueAmt + STDOffsetAmount + RECOffsetAmount + RECOffsetOcc + RECOffsetExecuted + 
      block3 + issueAge + block4 + reinsPreNotice + reinsCeded + allPmts + YTDPmts + lName + fName + 
      block5 + ceded + WP + reportedDate); 

      //Write to the output record DI_Extract.txt 
      sw.WriteLine(dataOutput); 

      counter++; 
      pbrRecordsProcessed.Value = counter; 
     }//end for loop 

    }//end streamwriter 

}//end if 
+1

루프 내부에서'OleDbConnection'을 여는 것처럼 들립니다. 다음 반복 전에 연결을 닫는 것을 기억하십니까? 또한 각 반복마다 새로운 연결을 열어야합니까, 아니면 루프 전에 연결을 연 다음 나중에 닫을 수 있습니까? (코드의 관련 부분을 보지 않고도 우리가 할 수있는 일은 모두 짐작할 수 있습니다.) –

+0

@Gord My Data Access가 열리고 SQL 명령을 실행 한 다음 즉시 닫습니다. 이것은 내 프로그램의 모든 곳에서 아무런 문제없이 작동하지만, 19 개의 전체 루프를 실행 한 후에는 언제나 멈추고 그 예외를 제공합니다. 나는 그것이 왜 작동 할 것인가에 대해 확신 할 수 없으며, 겉으로보기에는 어디에서나 작동을 멈추게됩니다. – SteveAnselment

+0

@Gord 내가 찾은 모든 관련 코드를 포함하도록 내 질문을 편집했습니다. – SteveAnselment

답변

0

이 내부

DataTable iRecNum2ClaimRecNumFromClaim = dbConnect.readDB(SQLString); 

. 왜 내가 예외를 항상 얻지는 못했는지 확신 할 수 없지만이 문제를 수정하는 것은 예외적으로 애플리케이션을 엄청나게 빨라지게하지 못했습니다.