【发布时间】:2011-05-26 23:29:20
【问题描述】:
我的代码中有一个部分用于查询网络上的所有 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;
}
}
【问题讨论】:
-
@Abe - 这就是我添加 secondTime 标志的原因,这样它只会循环一次。
-
只是一般性评论,我认识的大多数开发人员都会反对使用异常进行代码分叉。异常应该显示或记录错误消息,然后留下出错的代码。将生产力代码放在一个 catch 块中确实混淆了关注的领域。