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);
}
答案 0 :(得分:7)
对于有多少级别的嵌套,无论有没有using
,都没有设置限制,但是当然有一个实际限制,你可以在屏幕上放置多少嵌套,而不会让你的眼睛受伤。为此,限制嵌套通常是个好主意。你可以通过在复合语句是可选的之后观察花括号来做到这一点。因此,您可以这样做:
using (MySqlConnection con = new MySqlConnection(Properties.Settings.Default.ConnectionString))
using (MySqlDataAdapter da = new MySqlDataAdapter())
using (DataTable dt = new DataTable()) {
...
}
这些陈述仍像以前一样彼此嵌套,但它们在屏幕上看起来“平坦”。
此方法的一个限制是所有三个变量(con
,da
和dt
)都将放置在同一范围的末尾。在这种特殊情况下,这不是问题,因为你结束所有三个范围而中间没有任何语句(即你最后有三个结束括号)。但是,需要比其他变量更早结束其中一个变量的范围可能会迫使您使用额外的嵌套级别。
答案 1 :(得分:2)
我倾向于将它们叠加起来,有点像这样:
try
{
using (var connection = new MySqlConnection(...))
using (var adapter = new MySqlDataAdapter())
using (var table = new DataTable())
using (var cmd = new MySqlCommand(...))
{
...
}
}
需要注意的是,如果只有一条指令,则范围不需要用大括号{ }
包围。
同样适用于foreach
和if
块:
foreach(var x in y) DoSomething();