Try-Catch和"继续" - 这可能吗?

Mar*_*ram 5 .net c# try-catch

我的代码中有一个部分,我在网络上查询所有SQL Server数据库.我首先尝试使用SQL登录来访问SQL Server实例,但如果失败,那么我想尝试使用我的Windows凭据进行连接.之后,如果我仍然无法连接,那么我希望代码失败,然后通知用户.

所以我想我要问的是如何从Try-Catch块内部循环回到Try-Catch块上方的行:

String conxString = @"Data Source=SQLInstance1;User ID=FOO;Password=BAR;";
bool secondTime = false;

using (SqlConnection sqlConx = new SqlConnection(conxString))
     {
         Try{
               sqlConx.Open();
               DataTable tblDatabases = sqlConx.GetSchema("Databases");
               sqlConx.Close();
               secondTime = false;
               Console.WriteLine("SQL Server found!");
         }
         Catch(System.Data.SqlClient.SqlException e){
                if (!secondTime){
                   secondTime = true;
                   conxString = @"Data Source=SQLInstance1; Integrated Security=True;";
                      //Loop back to the using statement to try again with Windows Creds
                {
                 else{
                   Console.WriteLine("SQL Server not found or credentials refused");
                 }
                   //Report Failure to connect to user

         }
         finally{
            //Reset Variable
            secondTime = false;
         }

      }
Run Code Online (Sandbox Code Playgroud)

Abe*_*ler 11

我可能会走这条路:

String conxString = @"Data Source=Instance1;User ID=FOO;Password=BAR;";
//in your main function
if(!TryConnect(conxString))
{
   Console.WriteLine("SQL Creditials failed.  Trying with windows credentials...");
   conxString = "new conn string";
   TryConnect(conxString);
}
..............
//new function outside of your main function
private bool TryConnect(string connString)
{
   using (SqlConnection sqlConx = new SqlConnection(conxString))
     {
         Try{
               sqlConx.Open();
               DataTable tblDatabases = sqlConx.GetSchema("Databases");
               sqlConx.Close();
         }
         Catch(System.Data.SqlClient.SqlException e){
                return false;
         }
         return true;    
      }
}
Run Code Online (Sandbox Code Playgroud)


Ric*_*key 5

您可以在成功时使用for循环break:

for (int attempt = 1; attempt <= 2; attempt++)
{
    try
    {
        /* perform attempt */
        var success = TryToConnect();
        if (success)
            break;
    }
    catch (Exception e)
    {
        /* report error */
    }
}
Run Code Online (Sandbox Code Playgroud)

您还可以记录您是否成功等,或者增加尝试次数或使尝试次数可配置.

  • +1回答.总是从零开始索引`for(int attempt = 0;尝试<2;尝试++)`.` (2认同)
  • 但是,我认为对象是在尝试之间更改连接字符串,是吗? (2认同)