2014-10-11 26 views
0

我有一个窗体,显示用户选择地理区域的组合框,然后根据选择设置SQL连接并执行SQL命令。用户总是很有可能无法访问SQL Server。我设置了一个try/catch,并向用户显示错误信息,但并不真正想要中断,我是VS C#的新手,并且正在寻求关于如何将控制传递给用户可以通过调整的一点的指导不同的选择。如何为登录失败处理SQL异常

将执行回传给表单加载是合理的吗?如果是的话,我该怎么做?如果不是,应该如何处理?

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (comboBox1.SelectedIndex > 0) 
     { 
      List<String> distinctTableList = AttributeMap.DistinctTablesList(comboBox1.SelectedItem.ToString()); 
      lbTableNames.DataSource = distinctTableList; 
     } 
    } 

    public static List<String> DistinctTablesList(String environment) 
    { 
     List<String> tables = new List<string>(); 
     var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
     AppSettingsSection appSettingSection = (AppSettingsSection)config.GetSection("cbSettings"); 
     SqlConnection sqlcon = new SqlConnection(appSettingSection.Settings[environment].Value); 
     using (sqlcon) 
     { 
         StringBuilder errorMessages = new StringBuilder(); 
         using (sqlcon) 
         { 
          try 
          { 
           sqlcon.Open(); 
          } 
          catch (SqlException ex) 
          { 
           MessageBox.Show(ex.Message); 
          } 
         } 


public partial class frmClassBuilder : Form 
{ 
    private List<AttributeMap> attributeMapList; 
    private CacheClassFactory cacheFactory; 

    public frmClassBuilder() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     List<String> environmentList = AttributeMap.EnvironmentList(); 
     comboBox1.DataSource = environmentList; 
    } 
============================================================= 
    using (sqlcon) 
    { 
     try 
     { 
      sqlcon.Open(); 
     } 
     catch (SqlException ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
+0

向我们展示如何使用连接字符串实例化'sqlcon'?你是什​​么意思“我真的不想打破”?您可以在这里获得创意,如果没有太多的区域,您可以尝试环境列表中的所有值,并删除导致异常的条目,只留下组合框中用于用户选择的有效环境/连接字符串 - 这样它就不会中断。 – 2014-10-11 04:46:38

回答

0

我在企业桌面客户端之一中使用了以下方法,但它仍在使用。

假设你已经combobox_SelectedIndexChanged()方法,它应该是这样的:

public void combobox_SelectedIndexChanged() 
    { 
     string selectedCountry = "country"; //build actual connection string as you do now. 
     string connectionString = string.Format("Data Source={0};Initial Catalog=Detrack;Integrated Security=True;", selectedCountry); 
     var sqlCon = new SqlConnection(connectionString); 
     using (sqlCon) 
     { 
      // Disable some controls 
      try 
      { 
       sqlCon.Open(); 
      } 
      catch (SqlException ex) 
      { 
       MessageBox.Show(ex.Message); 
       // Disable "OK"/"Next" button 
       return; 
      } 
      finally 
      { 
       ///Enable controls 
      } 

      sqlCon.Close(); 

      // "OK"/"Next" button 
     } 
    } 

在这种方法中,你是否连接可以打开, 如果不能:

  • 显示错误消息
  • 禁用允许用户继续交互的控件,直到做出正确选择

如果可以,只需关闭连接并转到代码的下一部分,即实际使用连接的位置。

您还需要某种显示给用户的“正在检查连接”消息,并在连接被检查时阻止他的交互。

+0

它看起来像在MessageBox带我回到ComboBox之后简单地放置一个返回,并且看起来工作正常。 我在调试中接着执行,并注意到Finally语句不管执行什么。我肯定没有经验在其他一些情况下认识到这一点的有用性,但是在这里没有看到需要。 谢谢你的建议。 – 2014-10-12 14:35:07

+1

在这种特殊情况下,finally块允许启用控件(即国家组合框)忽略连接检查结果。您可以在catch块中和连接关闭部分之后两次写入“Enable controls”块,但是“finally”允许只写一次,因为它始终执行。 – 2014-10-12 17:48:49

相关问题