Comprar un libro y hacer una resta

Utilizo estos siguientes códigos para comprar un libro y ..... En el TextBox cuando cada vez que escribo el número de libros vendidos se actualiza uno nuevo TextBox valor en la base de datos. Debe hacer una resta cada vez que venda libros. Pero, actualiza los nuevos valores.

private void textBox1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Return)
        {
            sql = new SqlConnection(@"Data Source=PC-PC\PC;Initial Catalog=Anbar;Integrated Security=True");
            adapter = new SqlDataAdapter("select * from Goods", sql);
            cmd = new SqlCommand();
            cmd.Connection = sql;
            cmd.CommandText = ("Update Goods set Buy =@Buy, Remain =@Remain where GoodsNumber =@GoodsNumber");
            cmd.Parameters.AddWithValue("@Buy", Convert.ToInt32(textBox1.Text));
            cmd.Parameters.AddWithValue("@GoodsNumber", Convert.ToInt32(comboBox1.Text));
            cmd.Parameters.AddWithValue("@Remain", Convert.ToInt32(comboBox3.Text) - Convert.ToInt32(textBox1.Text));
            sql.Open();
            cmd.ExecuteNonQuery();
            sql.Close();
            fill();
        }
    }

Debe mostrar el remanente del total de Libros.

preguntado el 03 de mayo de 12 a las 17:05

Agregue una declaración de uso alrededor de su conexión sql y objetos de comando. msdn.microsoft.com/en-us/library/yh598w02.aspx -

¿Usar la declaración resolverá este problema? ¿Cómo? -

Ali, ¿qué hay en Combobox3.Text? Además, ¿por qué tienes un adaptador y no lo estás llenando en ninguna parte? Creo que primero debe obtener el valor de los libros restantes de la base de datos y luego restarlo del valor del cuadro de texto y luego actualizar la base de datos:

@aliprogrammer, no, no lo hará. P.Brian.Mackey solo intenta ofrecer algunos consejos útiles. -

No, es la mejor práctica para limpiar recursos externos. ¿Está diciendo que la interfaz de usuario no muestra el resto correctamente? No veo ningún problema obvio con la declaración de actualización. Si estoy adivinando correctamente, comboBox3.Text debería actualizarse y no está sucediendo aquí. comboBox3.Text = Convert.ToInt32(comboBox3.Text) - Convert.ToInt32(textBox1.Text) -

1 Respuestas

creo que el problema es que no actualizas comboBox3 después de actualizar el recuento restante en la base de datos.

Por cierto, ¿por qué usas el cuadro combinado para esto? También hay nombres de columnas muy confusos en la base de datos: Buy, GoodsNumber y Remain. Es realmente difícil adivinar qué datos se almacenan allí. Considere nombres como ProductId, Nombre y Cantidad.

Si implementara algo así, comenzaría cargando productos en el cuadro combinado:

private void Form_Load(object sender, EventArgs e)
{
    productsComboBox.DataSource = GetAllProducts();
    productsComboBox.DisplayMember = "Name";
    productsComboBox.ValueMember = "Id";
}

private IList<Product> GetAllProducts()
{
    List<Product> products = new List<Product>();

    // I use ConfigurationManager from System.Configuration.dll 
    // to read connection strings from App.config
    string connectionString = ConfigurationManager.ConnectionStrings["anbar"].ConnectionString;

    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        string query = "SELECT * FROM Products";
        SqlCommand cmd = new SqlCommand(query, conn);
        conn.Open();
        SqlDataReader reader = cmd.ExecuteReader();

        while (reader.Read())
        {
            products.Add(new Product() { Id = (int)reader["Id"],
                                         Name = (string)reader["Name"],
                                         Quantity = (int)reader["Quantity"] });
        }
    }
    return products;
}

El producto es de clase simple:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Quantity { get; set; }
}

Cuando el producto seleccionado cambia, muestra sus detalles:

private void ProductsComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
    Product product = productsComboBox.SelectedItem as Product;
    qtyTextBox.Text = product.Quantity.ToString();
    // I use NumericUpDown control to input numbers
    // Minimum is set to 1
    qtyToSellNumericUpDown.Maximum = product.Quantity;
}

Y por último, cuando ingresé la cantidad para vender (1 ... cantidad actual), hago lo siguiente:

private void ButtonSell_Click(object sender, EventArgs e)
{
    Product product = productsComboBox.SelectedItem as Product;
    int qtyToSell = (int)qtyToSellNumericUpDown.Value;
    SellProduct(product, qtyToSell);
    product.Quantity -= qtyToSell; // update product
    qtyTextBox.Text = product.Quantity.ToString(); // update current quantity 
}

private void SellProduct(Product product, int qtyToSell)
{
    string connectionString = ConfigurationManager.ConnectionStrings["anbar"].ConnectionString;

    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        string query = "UPDATE Products SET Quantity = @Quantity WHERE Id = @Id";
        SqlCommand cmd = new SqlCommand(query, conn);
        cmd.Parameters.AddWithValue("@Id", product.Id);
        cmd.Parameters.AddWithValue("@Quantity", product.Quantity - qtyToSell);
        conn.Open();
        cmd.ExecuteNonQuery();
    }
}

Eso es todo. Sí, hay muchas cosas que mejorar, pero esta pequeña muestra funciona.

ACTUALIZACIÓN: Cómo agregar una cadena de conexión a App.Config

<configuration>
  <connectionStrings>
    <add name="anbar" 
         connectionString="Data Source=PC-PC\PC;Initial Catalog=Anbar;Integrated Security=True"                 
         providerName="System.Data.SqlClient"/>
  </connectionStrings>
</configuration>

contestado el 03 de mayo de 12 a las 22:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.