失败后数据库重新连接

时间:2013-06-06 17:53:28

标签: c# .net sql debugging try-catch

我目前正在处理的程序收集数据并将数据导出到SQL数据库。如果数据库出现故障,我已编码,以便将数据写入CSV文件。它将是一个始终使用配置文件运行的应用程序,用户可以在进程运行时更改信息(例如数据库连接)。我遇到的问题是,一旦我进入写入CSV文件的循环,我就无法回到将数据放入数据库,直到重新启动应用程序。以下是相关代码:

class MethodClass
{
    public static void Method()
    {
        while (true)
        {            
        ConfigurationManager.RefreshSection("appSettings");

        //Normally Running Code that Generates the Data

        //Tries to write data to database 3 times                
        if (dbWrite != 2 && dbWrite != 3)
        {
             dbWrite = 0;
        }
        while (dbWrite < 2)
        {
             try
             {
                  db.TblData.InsertOnSubmit(newrecord);
                  db.SubmitChanges();
                  break;
             }
             catch
             {
                  dbWrite++;
             }
        }
        if (dbWrite == 2)
        {
             try
             {
                  db.TblData.InsertOnSubmit(newrecord);
                  db.SubmitChanges();
             }
             catch (Exception e)
             {
                  dbWrite++;
                  log.Warn("Database Write Error", e);
                  BackupMethod();
             }

        }
        if (dbWrite == 3)
        {
             try
             {
                  db.TblData.InsertOnSubmit(newrecord);
                  db.SubmitChanges();
                  dbWrite = 0;
             }
             catch
             {
                  BackupMethod();
                  log.Info("Still not writing to Database");
             } 
        }
    }
}

Class ConfigVariables
{
    public static string SqlUser = ConfigurationManager.appSettings["SqlUser"];
    //Other Config Variables
}

作为参考,我刚检查过,问题似乎是在程序运行时从我的Config文件中获取信息。如果我更改配置文件中的其他值,则在下次运行程序之前它们不起作用。大家都知道,我正在编辑Debug / Release文件夹中的App.exe.config文件。

更新:似乎如果我在RefreshSection();之后分配变量,它将起作用。但是,由于某种原因,我将变量放在一个单独的类中。有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

我能够通过在ConfigVariables类中创建一个方法来修复此问题,该方法在单独的线程上刷新并重新分配while循环中的变量。这允许我将变量组织在另一个类中,而不是通过在我的代码中引用它们来更改任何内容。现在我只需做一些性能测试;希望不断这样做不会导致性能问题。