2

通过保存为数据表的一系列循环和数据库调用(仅限 Select 语句),我正在生成一个包含这些值的 .txt 文件。它运行了一会儿(19行......19个完整循环周期)然后我得到一个运行时异常被connection.Open()

我将整个循环放在一个 try catch 块中,以便捕获异常并生成消息,然后是 2 个空行,然后是堆栈跟踪。 在此处输入图像描述

我试图阅读这篇文章并弄清楚该怎么做,但在数据库连接方面我有点新手。我在别处看过,但似乎没有找到一个非常适合我情况的问题。

仅供参考:C# 4.0 Windows 窗体应用程序,Access 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);
        }
    }

这是循环(它有点长,可能会做得更好,但我只是想找出为什么它在多次工作后会中断)

异常从以下行引发:

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
4

1 回答 1

0

在深入研究代码后,我意识到连接在关闭之前尝试打开 3 次。不知道为什么我没有一直收到异常,但纠正这个问题不仅极大地加快了应用程序的速度,而且还清除了异常。

于 2013-11-11T16:51:00.367 回答