C sharp - transaccion con varias consultas

 
Vista:
sin imagen de perfil
Val: 23
Ha aumentado 1 puesto en C sharp (en relación al último mes)
Gráfica de C sharp

transaccion con varias consultas

Publicado por anthony (10 intervenciones) el 22/11/2018 03:12:53
hola amigos buenas noches estoy armando un metodo donde guardo pedido y detalle ejcutando una transaccion
pero cuando lo ejecuto se pega y arroja tiempo de espera agotado mi codigo es el siguiente
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
{
    using (SqlConnection con = new SqlConnection(conexion))
    {
        con.Open();
        transaccion = con.BeginTransaction();
        try
        {
            consultar = new SqlCommand(@"
            INSERT INTO [shop].[Pedido]([FechaEmision],[FechaEntrega],[IDCliente],[DocIdentidad],[Direccion],[NumeroDoc],[ValorVenta],[ValorAfecto],[Valorinafecto],[SubTotal],[Descuento],[Total],[IDAlmacen],[IDResponsable],[Anulado],[EstadoFacturacion])
            VALUES(convert(datetime2,@FechaEmision,102),convert(datetime2,@FechaEntrega,102),@IDCliente,@DocIdentidad,@Direccion,@NumDoc,@ValorVenta,@ValorAfecto,@ValorInafecto,@Subtotal,@Descuento,@Total,@IDAlmacen,@IDResponsable,0,@EstadoFacturacion)
            ", con);
            consultar.Parameters.AddWithValue("@FechaEmision", FechaEmision);
            consultar.Parameters.AddWithValue("@FechaEntrega", FechaEntrega);
            consultar.Parameters.AddWithValue("@IDCliente", IDCliente);
            consultar.Parameters.AddWithValue("@DocIdentidad", DocIdentidad);
            consultar.Parameters.AddWithValue("@Direccion", Direccion);
            consultar.Parameters.AddWithValue("@NumDoc", NumDoc);
            consultar.Parameters.AddWithValue("@ValorVenta", ValorVenta);
            consultar.Parameters.AddWithValue("@ValorAfecto", ValorAfecto);
            consultar.Parameters.AddWithValue("@ValorInafecto", ValorInafecto);
            consultar.Parameters.AddWithValue("@Subtotal", Subtotal);
            consultar.Parameters.AddWithValue("@Descuento", Descuento);
            consultar.Parameters.AddWithValue("@Total", Total);
            consultar.Parameters.AddWithValue("@IDAlmacen", IDAlmacen);
            consultar.Parameters.AddWithValue("@IDResponsable", IDResponsable);
            consultar.Parameters.AddWithValue("@EstadoFacturacion", EstadoFacturacion);
            consultar.Transaction = transaccion;
            try { consultar.ExecuteNonQuery(); } catch (Exception e) { MessageBox.Show(e.Message); };
            foreach (DataGridViewRow fila in dgv.Rows)
            {
                if (Convert.ToBoolean(entidad.EntidadID3(conexion, "inafecto", "ImpuestoProductoServicio", "IDProductoServicio = " +
                    entidad.EntidadID(conexion, "productoservicio", "codigo", fila.Cells[0].Value.ToString()))) == true)
                {
                    consultar = new SqlCommand(@"
             INSERT INTO [shop].[ItemPedido]([IDPedido],[IDProducto],[Descripcion],[ValorUnitario],[ValorImpuesto],[IDUnidad],[Cantidad],[Inafecto],[bonificacion],[ValorAfecto],[ValorInafecto],[ValorVenta],[Descuento],[SubTotal],[Total])
             VALUES(@IDPedido,@IDProducto,@Descripcion,@ValorUnitario,18.00,@IDUnidad,@Cantidad,@Inafecto,@bonificacion,@ValorAfecto,@ValorInafecto,@ValorVenta,@Descuento,@SubTotal,@Total)
             ", con);
                    consultar.Parameters.AddWithValue("@IDPedido", entidad.EntidadID2(conexion, "max(pkid) + 1", "shop.pedido"));
                    consultar.Parameters.AddWithValue("@IDProducto", entidad.EntidadID(conexion, "productoservicio", "codigo", fila.Cells[0].Value.ToString()));
                    consultar.Parameters.AddWithValue("@Descripcion", fila.Cells[1].Value.ToString());
                    consultar.Parameters.AddWithValue("@ValorUnitario", fila.Cells[4].Value.ToString());
                    consultar.Parameters.AddWithValue("@IDUnidad", entidad.EntidadID3(conexion, "PKID", "unidad", "IDProductoServicio = " + entidad.EntidadID(conexion, "productoservicio", "codigo", fila.Cells[0].Value.ToString()) + " and Abreviacion = '" + fila.Cells[2].Value.ToString() + "'"));
                    consultar.Parameters.AddWithValue("@Cantidad", fila.Cells[3].Value.ToString());
                    consultar.Parameters.AddWithValue("@Inafecto", 1);
                    consultar.Parameters.AddWithValue("@bonificacion", fila.Cells[6].Value.ToString());
                    consultar.Parameters.AddWithValue("@ValorAfecto", 0);
                    consultar.Parameters.AddWithValue("@ValorInafecto", (Convert.ToInt32(fila.Cells[3].Value) * Convert.ToDecimal(fila.Cells[4].Value)));
                    consultar.Parameters.AddWithValue("@ValorVenta", (Convert.ToDecimal(fila.Cells[7].Value) / (decimal)1.18).ToString());
                    consultar.Parameters.AddWithValue("@Descuento", fila.Cells[5].Value.ToString());
                    consultar.Parameters.AddWithValue("@SubTotal", fila.Cells[7].Value.ToString());
                    consultar.Parameters.AddWithValue("@Total", fila.Cells[8].Value.ToString());
                    consultar.Transaction = transaccion;
                    try { consultar.ExecuteNonQuery(); } catch (Exception e) { MessageBox.Show(e.Message); };
                }
            }
            transaccion.Commit();
        }
 
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            transaccion.Rollback();
        }
    }
 
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
1
Responder

transaccion con varias consultas

Publicado por Juan-Carlos Marmolejo (1 intervención) el 22/11/2018 18:18:07
Tuve un problema similar y lo solucione aumentando el valor de la propiedad:

SqlCommand.CommandTimeout = 600;

Espero te sirva de algo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

transaccion con varias consultas

Publicado por miguelZ (7 intervenciones) el 22/11/2018 22:41:01
Que tal como dice Juan Carlos solo es modificar en la configuracion el tiempo de espera para el Timeout,

es recomendable que tu transaccion la implementes del lado del servidor SQL, asi no se implementara el

query de la transaccion del lado de la capa de negocio, y se ejecutara en menor tiempo.


Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Wilfredo Patricio Castillo
Val: 707
Oro
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

transaccion con varias consultas

Publicado por Wilfredo Patricio Castillo (416 intervenciones) el 24/11/2018 14:37:04
La transacción aparentemente está bien, salvo unas cuantas correcciones, pero tiene un problema que creo que es el que te está dando lata.

El tema va porque el primer command que tiene el encabezado, en el detalle lo estás reiniciando con los datos del detalle, entonces entra en trompo y agota cualquier tiempo de espera que le pongas a la cadena de conexión.

Usa un command para el encabezado y otro para el detalle, con eso no tendrás problemas.

Recomendación: Así como estás haciendo uso del USING para la conexión deberías hacerlo desde la transacción y los Commands, para evitar ocupar la memoria en vano.

Saludos cordiales,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

transaccion con varias consultas

Publicado por DavidM (1 intervención) el 05/12/2018 18:36:53
Hola,

Lo que estás haciendo NO es lo que yo recomendaría y más si piensas en que tu sitio web esté alojado en un servidor diferente a donde esta la base de datos. Estás abriendo una transacción afectando el rendimiento de la BD.

Yo te sugeriría ampliamente crear un procedimiento almacenado donde te reciba tanto el encabezado como el detalle (usa XML para enviar los detalles) o JSON ( si es SQL 2016). Dentro del procedimiento puedes iniciar una transacción y controlarla ahí adentro.

desde el código solo llamas el SP. Es más rápido, más eficiente y más escalable.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar