我正在创建一个连接到数据库并使用ODBC连接器的web应用程序,我使用以下代码来执行此操作
private void SetupConnection()
{
conn.ConnectionString =
ConfigurationManager.ConnectionStrings["live"].ConnectionString;
OdbcDataAdapter da =
new OdbcDataAdapter("SELECT * FROM MTD_FIGURE_VIEW1 '", conn);
da.Fill(ds);
}
我想创建一个try catch语句,它将继续尝试连接到数据库。
psudocode将尝试上面的功能,如果无法连接再试一次,如果连接没有任何错误继续进行。
有人可以帮我这个
从评论中提问相关更新:
我只是希望它继续尝试 原因是Web应用程序 即时通讯永远不会改变它 不断刷新数据,但是 数据库被切换了两个小时 每晚都要备份 期间我希望应用程序继续 试图连接
答案 0 :(得分:2)
怎么样,
const int MaxRetries = 42 //or any other number you like
for (int r = 1; r <= MaxRetries; r++)
{
try
{
//The thing we want to test
break;
}
catch (SomeExceptionWeWantToIgnore)
{
System.Threading.Thread.Sleep(1000)
//Or any number of milliseconds you like (not 0)
}
}
如果这是你想做多次并重新使用的事情。 Youi可以考虑把它放在一个可恢复的函数中,就像我在this answer中所做的那样,警告这可能是一种过度杀伤。
答案 1 :(得分:2)
private void SetupConnection()
{
conn.ConnectionString =
ConfigurationManager.ConnectionStrings["ZenLive"].ConnectionString;
bool success = false;
while(!success)
{
try
{
OdbcDataAdapter da =
new OdbcDataAdapter("SELECT * FROM MTD_FIGURE_VIEW1 '", conn);
da.Fill(ds);
success = true;
}
catch(Exception e)
{
Log(e);
Thread.Sleep(_retryPeriod)
}
}
}
注意,正如人们评论的那样,真的不是一个好主意。您需要一些方法来区分数据库关闭的“预期”异常和您想要继续重试的情况,以及发生意外情况并且您不想继续尝试的情况。
答案 2 :(得分:1)
如果数据库未启动,则尝试连接数据库是没有意义的。你只是在浪费时间尝试连接到备份的东西。我会做这样的事情:
DateTime backupStart = Convert.ToDateTime("20:00:00");
DateTime backupEnd = Convert.ToDateTime("22:00:00");
DateTime now = DateTime.Now;
while (true)
{
// If its backup time then sleep for 2 hours, 0 min and 0 seconds
if (now > backupStart && now < backupEnd)
{
System.Threading.Thread.Sleep(new TimeSpan(2, 0, 0));
now = DateTime.Now; // So we dont sleep again later
}
try
{
// Try db connect
// Break if successful
break;
}
catch (Exception ex)
{
// Wait 30 seconds then loop then try again
System.Threading.Thread.Sleep(new TimeSpan(0, 0, 30));
}
}