2013-05-17 74 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的答案,它不僅更加完整,它給你的實際原因,/當你要引入縮進的水平;我只告訴你爲什麼你不需要它。 –

相關問題