我应该使用多少使用语句?有限制吗?

时间:2013-05-17 00:19:37

标签: c# .net idisposable

嘿,伙计们,你能不能给我一些提示。我注意到打开和关闭数据库连接的正确方法是使用using statement自动使用IDisposable界面释放资源(如果我错了请纠正我)。

所以我决定开始使用它,但代码开始看起来有点连线超过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);
}

2 个答案:

答案 0 :(得分:7)

对于有多少级别的嵌套,无论有没有using,都没有设置限制,但是当然有一个实际限制,你可以在屏幕上放置多少嵌套,而不会让你的眼睛受伤。为此,限制嵌套通常是个好主意。你可以通过在复合语句是可选的之后观察花括号来做到这一点。因此,您可以这样做:

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

这些陈述仍像以前一样彼此嵌套,但它们在屏幕上看起来“平坦”。

此方法的一个限制是所有三个变量(condadt)都将放置在同一范围的末尾。在这种特殊情况下,这不是问题,因为你结束所有三个范围而中间没有任何语句(即你最后有三个结束括号)。但是,需要比其他变量更早结束其中一个变量的范围可能会迫使您使用额外的嵌套级别。

答案 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();
相关问题