0

通過一系列循環和數據庫調用(僅選擇語句)保存爲數據表我使用這些值生成一個.txt文件。它運行良好一段時間(19行... 19個完整的循環週期),然後我得到一個運行時異常被拋出connection.Open()System.Data.OleDb.OleDbException(0x80004005):未指定錯誤

我有整個循環內的try catch塊,以便趕上例外並生成消息,然後生成2個空行然後是堆棧跟蹤。 enter image description here

我已經試過了解這一點,弄清楚該怎麼做,但在數據庫連接方面我有點新手。我看了別處,但似乎沒有找到一個適合我的情況的問題。

FYI:C#4.0的Windows窗體應用程序,Access數據庫

我希望能找到從哪裏開始找一些建議。我肯定我的連接時,拋出此錯誤關閉,由於我實現了驗證如下所示:

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); 
     } 
    } 

這裏是循環(其有點長,可能會做得更好,但我只想找到爲什麼它打破了它的工作多次)

的異常是從讀取的行拋出:

DataTable iRecNum2ClaimRecNumFromClaim = dbConnect.readDB(SQLString); 

這裏面:

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我的數據訪問被設置爲打開,執行sql命令,然後立即關閉。這在我的程序的其他地方沒有任何問題,但由於某種原因,它執行了19個完整的循環後,每次都會停下來,並給我這個例外。我不確定它爲什麼會起作用,然後看起來無處不在。 – SteveAnselment

+0

@Gord編輯我的問題,包括我能找到的所有相關代碼。 – SteveAnselment

回答

0

尋找更深的代碼,我意識到,連接試圖打開3次關門之前之後。不知道爲什麼我一直沒有收到異常,但糾正這個問題不僅加速了應用程序的發展,而且清除了異常。

相關問題