2013-05-17 35 views
3

嘿,你可以给我一些提示。我注意到打开和关闭数据库连接的正确方法是使用自动使用IDisposable接口释放资源的using statement(请纠正我,如果我错了)。我应该使用多少使用语句?有一个限制?

所以我决定开始使用它,但是代码在超过3个之后开始看起来有点线。请问如果我使用它错误,请告诉我吗?这是一个按钮事件,我使用using语句创建一些MySql类对象。

private void buttonAdicionar_Click(object sender, EventArgs e) 
{ 
    using (MySqlConnection con = new MySqlConnection(Properties.Settings.Default.ConnectionString)) 
    { 
     using (MySqlDataAdapter da = new MySqlDataAdapter()) 
     { 
      using (DataTable dt = new DataTable()) 
      { 
       try 
       { 
        using (MySqlCommand cmd = new MySqlCommand("SELECT codigo, descricao, unidMedida, vlUnitario FROM tab_estoque WHERE codBar = @codBar;", con)) 
        { 
         cmd.Parameters.Add("@codBar", MySqlDbType.VarChar).Value = this.textBoxCodBarras.Text; 

         con.Open(); 
         da.SelectCommand = cmd; 
         da.SelectCommand.ExecuteNonQuery(); 
         da.Fill(dt); 

         // Caso haja alguma linha no DataSet ds então existe um produto com o codigo de barra procurado no banco de dados 
         if (dt.Rows.Count == 1) 
         { 
          bool itemIgual = false; 
          int rowIndex = 0; 

          // Passa por todas as linhas do carrinho de compras para verificar se existe outro item igual 
          foreach (DataGridViewRow dgvCarrinhoRow in dataGridViewCarrinho.Rows) 
          { 
           // Verifica se o produto da linha do carrinho de compra é o mesmo do código de barras 
           if (dgvCarrinhoRow.Cells[1].FormattedValue.ToString() == dt.Rows[0][0].ToString()) 
           { 
            // Verifica se estão tentando vender uma certa quantidade de um produto que esteja acima da quantidade do mesmo no estoque 
            if (this.VerificarSeExcede(Convert.ToInt32(dgvCarrinhoRow.Cells[1].FormattedValue), Convert.ToInt32(dgvCarrinhoRow.Cells[3].FormattedValue) + 1) == 1) 
            { 
             // Adiciona mais um na quantidade do item no carrinho de compra 
             dgvCarrinhoRow.Cells[3].Value = Convert.ToInt32(dgvCarrinhoRow.Cells[3].FormattedValue) + 1; 
             // Multiplica o VL. ITEM. pela nova quantidade e armazena o resultado em VL. ITEM 
             dgvCarrinhoRow.Cells[6].Value = String.Format("{0:f}", 
              (Convert.ToDouble(dgvCarrinhoRow.Cells[3].Value) * Convert.ToDouble(dgvCarrinhoRow.Cells[5].Value))); 

             // Adiciona o valor do produto ao valor total da venda 
             this.totalVenda += Convert.ToDouble(dgvCarrinhoRow.Cells[5].Value); 
            } 
            else if (this.VerificarSeExcede(Convert.ToInt32(dt.Rows[0][0].ToString()), 1) == 0) 
            { 
             MessageBox.Show("Ocorreu a tentativa de vender um produto que está em falta no estoque.", "Caixa", MessageBoxButtons.OK, MessageBoxIcon.Error); 
            } 
            else 
            { 
             MessageBox.Show("Ocorreu a tentativa de vender uma certa quantidade deste produto que excede a quantidade do mesmo no estoque.", "Caixa", MessageBoxButtons.OK, MessageBoxIcon.Error); 
            } 

            itemIgual = true; // Evita que o if abaixo seja executado 
            break; // Sai do loop para econimizar tempo no processamento 
           } 

           rowIndex++; 
          } 

          // Caso o item não seja igual a nenhum outro no carrinho ele é adicionado 
          if (!itemIgual) 
          { 
           // Verifica se estão tentando vender uma certa quantidade de um produto que esteja acima da quantidade do mesmo no estoque 
           if (this.VerificarSeExcede(Convert.ToInt32(dt.Rows[0][0].ToString()), 1) == 1) 
           { 
            this.dataGridViewCarrinho.Rows.Add(
             ++this.item,      // ITEM 
             dt.Rows[0][0], // CÓDIGO 
             dt.Rows[0][3], // DESCRIÇÃO 
             1,       // QTD. 
             dt.Rows[0][2], // UN. 
             dt.Rows[0][3], // VL. UNIT. 
             dt.Rows[0][3]); // VL. ITEM. 

            // Adiciona o valor do produto ao valor total da venda 
            this.totalVenda += Convert.ToDouble(dt.Rows[0][3].ToString()); 
           } 
           else if (this.VerificarSeExcede(Convert.ToInt32(dt.Rows[0][0].ToString()), 1) == 0) 
           { 
            MessageBox.Show("Ocorreu a tentativa de vender um produto que está em falta no estoque.", "Caixa", MessageBoxButtons.OK, MessageBoxIcon.Error); 
           } 
           else 
           { 
            MessageBox.Show("Ocorreu a tentativa de vender uma certa quantidade deste produto que excede a quantidade do mesmo no estoque.", "Caixa", MessageBoxButtons.OK, MessageBoxIcon.Error); 
           } 
          } 

          this.AtualizarValorCompra(); 
          this.dataGridViewCarrinho.ClearSelection(); 
         } 
         else // Mensagem exibida caso a consulta nao retorne alguma coisa 
         { 
          MessageBox.Show("Este item não consta no banco de dados.", "Caixa", MessageBoxButtons.OK, MessageBoxIcon.Error); 
         } 
        } 
       } 
       catch (Exception ex) 
       { 
        MessageBox.Show("Ocorreu um erro durante a comunicação com o banco de dados.\n\n" + ex.Message, "Caixa", MessageBoxButtons.OK, MessageBoxIcon.Error); 
       } 
      } 
     } 
    } 

    this.LimparControles(1); 
} 

回答

6

没有设置限制嵌套你可以拥有,使用或不using多少水平,但当然有多少嵌套可以适合在屏幕上,而不让你的眼睛受到伤害的实际限制。为此,限制嵌套通常是一个好主意。你可以通过在复合语句是可选的之后观察大括号来完成。因此,你可以这样做:

using (MySqlConnection con = new MySqlConnection(Properties.Settings.Default.ConnectionString)) 
using (MySqlDataAdapter da = new MySqlDataAdapter()) 
using (DataTable dt = new DataTable()) { 
    ... 
} 

的陈述保持相互嵌套像以前一样,但他们看起来更“平”在屏幕上。

该方法的一个限制是所有三个变量(con,dadt)都将被置于同一范围的末尾。在这种情况下,这不是一个问题,因为您结束了所有三个范围之间没有任何语句(即最后有三个右括号)。但是,需要早于其他变量结束其中一个变量的作用域可能会强制您使用额外的嵌套级别。

+0

谢谢你提供的信息,我我以前不知道我能做到这一点! – Zignd

+2

+1最后一段:) –

2

我倾向于堆叠起来,有点像这样:

try 
{ 
    using (var connection = new MySqlConnection(...)) 
    using (var adapter = new MySqlDataAdapter()) 
    using (var table = new DataTable()) 
    using (var cmd = new MySqlCommand(...)) 
    { 
     ... 
    } 
} 

要注意的一点是,范围并不需要用大括号{ }包围,如果它只是一个单一的指令。

这同样适用于foreachif块:

foreach(var x in y) DoSomething(); 
+0

感谢您的信息太retailcoder,但dasblinkenlight的回答看起来更完整。 – Zignd

+0

没问题,在这里我编辑添加更多的肉;这个想法是,如果一个范围只有一条指令,那么范围并不会影响大括号。实际上 –

+0

@Zignd你应该接受dasblinkenlight的答案,它不仅更加完整,它给你的实际原因,/当你要引入缩进的水平;我只告诉你为什么你不需要它。 –

相关问题