none
Rapidez en registro de datos en bd RRS feed

  • Pregunta

  • Hola comunidad.. espero que esten bien y de buenos ánimos para ayudarme en el siguiente problema:

    estoy tratando de guardar la información en una base de datos que contiene dos tablas la una es los datos generales (solicitud) y la otra son lospedidos (detalles) la cual esta en un directorio en mi disco duro y lo hago de la siguiente forma

     Dim cadenaconexion As String = "provider=Microsoft.ACE.OLEDB.12.0;data source=" & Application.StartupPath & "\BD\Necesidad.accdb"
                Dim conexion As OleDb.OleDbConnection = New OleDb.OleDbConnection(cadenaconexion)
                Dim Sector, Representante, Identificacion, observaciones As String
                Dim Secuencial, Año As Integer
                Dim fecha As Date
                Secuencial = CInt(Mid(lblCodigo.Text, 1, 3))
                Año = CInt(Mid(lblCodigo.Text, 5, 4))
                fecha = CDate(TxtFecha.Text)
                Sector = TxtSector.Text
                Representante = TxtRepresentante.Text
                Identificacion = TxtCIdentificacion.Text
                observaciones = txtObservaciones.Text
                Dim sql As String = "INSERT INTO SOLICITUD(SECUENCIAL, AÑO, FECHA, SECTOR, REPRESENTANTE, IDENTIFICACION, OBSERVACIONES) VALUES(@SECUENCIAL,@AÑO, @FECHA, @SECTOR, @REPRESENTANTE, @IDENTIFICACION, @OBSERVACIONES) "
                Dim comando As OleDbCommand = New OleDbCommand(sql, conexion)
                conexion.Open()
                comando.Parameters.Clear()
                comando.Parameters.AddWithValue("@SECUENCIAL", Secuencial)
                comando.Parameters.AddWithValue("@AÑO", Año)
                comando.Parameters.AddWithValue("@FECHA", fecha)
                comando.Parameters.AddWithValue("@SECTOR", Sector)
                comando.Parameters.AddWithValue("@REPRESENTANTE", Representante)
                comando.Parameters.AddWithValue("@IDENTIFICACION", Identificacion)
                comando.Parameters.AddWithValue("@OBSERVACIONES", observaciones)
                comando.ExecuteNonQuery()
                conexion.Close()

    el problema es que este código me tarda cinco segundos como minimos, lo cual segun mi criterio es muy lento; si alguien conoce otro método para registrar la información que no se demore menos tiempo se les agradecería.

    lunes, 13 de julio de 2015 15:40

Respuestas

  • RESPTANDO las opiniones que me dieron y los caminos a escoger que me dieron termine haciendo asi el codigo que me demoraba:

     sql = "INSERT INTO DETALLES (CANTIDAD, DESCRIPCION) VALUES(@cantidad, @descripcion)"
                Dim comandDet As OleDbCommand = New OleDbCommand(sql, conexion)
                comandDet.Connection.Open()
                For Each FILA As DataGridViewRow In DGNecesidad.Rows
                    comandDet.Parameters.Clear()
                    comandDet.Parameters.AddWithValue("@cantidad", FILA.Cells(0).Value)
                    comandDet.Parameters.AddWithValue("@descripcion", FILA.Cells(1).Value)
                    comandDet.ExecuteNonQuery()
                Next
                comandDet.Connection.Close()
    se redujo el tiempo a dos y tres segundos, que para mi es satisfactorio, gracias todos por su ayuda.

    • Propuesto como respuesta RHCRD lunes, 13 de julio de 2015 17:21
    • Marcado como respuesta Karen MalagónModerator lunes, 13 de julio de 2015 20:21
    lunes, 13 de julio de 2015 17:04

Todas las respuestas

  • no puedo ponerte bien el codigo que necesitas pero te puedo dar una idea

    en mysql aveces mando varios querys a la vez y lo hago en un pequeño ciclo for y añadiendo ";" al final de cada query

    por ejemplo para guardar todos los campos de un datagridview

    Dim conexion As MySqlconection.......

    ...

    ...

    Dim sql As String = ""

    for fila as integer = 0 to datagridview1.rowcount -1

    Secuencial =datagridview1.item(1,fila).value
                Año = datagridview1.item(2,fila).value
                fecha = datagridview.item(3,fila).value
                Sector = datagridview.item(4,fila).value
                Representante = datagridview.item(5,fila).value
                Identificacion = datagridview.item(6,fila).value
                observaciones = datagridview.item(7,fila).value

    sql = sql & "INSERT INTO SOLICITUD(SECUENCIAL, AÑO, FECHA, SECTOR, REPRESENTANTE, IDENTIFICACION, OBSERVACIONES) VALUES('" & Secuencial & "', '" & Año & "', "' & fecha & '", '" & Sector & "', '" & Representante & "', '" & Identificacion & "', '" & observaciones & "');"

    Next

    asi se van concatenando los querys y a la hora de ejecutar el comando se guarda todo de jalon

    este codigo no debe de estar dentro de otro ciclo For almenos que primero concatenes todos los querys y despues haces todo el codigo de conexion y guardar y quitando todos los AddWithValue

    notese que yo solo estoy dando una idea de como lo haria yo en mysql si lo que quieres es guardar varios registros a la vez

    espero que esta idea te ayude en algo


    • Editado RHCRD lunes, 13 de julio de 2015 16:11
    lunes, 13 de julio de 2015 16:02
  • yo acotaria el problema. Donde tarda mas este método? En la ejecución del insert? En alguna otra parte del código?

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    lunes, 13 de julio de 2015 16:04
  • Gracias sergio por tu respuesta...  la voy a probar y te cuento como me fue...
    lunes, 13 de julio de 2015 16:10
  • Hola Rolando Salvatierra,

    No estoy de acuerdo con la propuesta de RHCRD, para nada es una buena práctica el que tengas los parámetros concatenados en las expresiones de condición. Es correcto la manera como vienes trabajando con parámetros, es seguro, ordenado y una buena practica.

    Ahora, la operación que haces es muy simple, la demora que mencionas es excesiva. Yo también pediría que revises si tienes algún código "aledaño" al insert que se esté ejecutando quizá antes o después y que sea el que este ocasionando la demora. 


    lunes, 13 de julio de 2015 16:17
  • Hola de nuevo sergio; no se si me puedas ayudar pero me da este error:

    Excepción no controlada del tipo 'System.Data.OleDb.OleDbException' en System.Data.dll

    Información adicional: Se encontraron caracteres después del final de la instrucción SQL.

    y lo coloque asi el codigo:

    For Each FILA As DataGridViewRow In DGNecesidad.Rows
                    sql &= "INSERT INTO DETALLES (CANTIDAD, DESCRIPCION) VALUES(" & FILA.Cells(0).Value & ",'" & FILA.Cells(1).Value & "');"
                Next
                Dim comandDet As OleDbCommand = New OleDbCommand(sql, conexion)
                comandDet.Connection.Open()
                comandDet.ExecuteNonQuery()
                comandDet.Connection.Close()

    si me puedes ayudar gracias.. caso contrario... igual gracias por la atencion prestada..

    lunes, 13 de julio de 2015 16:23
  • el que sugirio el codigo no fue sergio fui yo y me parece que el ";" es para MySql no se como separas varios querys en oledbc

    ademas en secuencial y año los tienes como enteros asi que esos dos no deberian llevar '

    y Willams Morales tiene razon en eso de que no es ordenado y "no es buena practica" el sabe mucho mas que yo, pero yo no tengo otra idea de como hacer varios INSERT a la vez, si el tiene otra idea que Funcione, hasle caso



    • Editado RHCRD lunes, 13 de julio de 2015 16:38
    lunes, 13 de julio de 2015 16:35
  • el codigo original que has escrito con la consulta parametrizada es correcto, tal y como dice Williams y las buenas practicas. Yo pondría un punto de ruptura el principio de ese código y pulsando F10 para ir paso a paso vería dónde se pierde mas tiempo.

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    lunes, 13 de julio de 2015 16:54
  • perdon RHCRD fue un error mio de lectura y les aclaro algo: el codido donde estan todos los datos generales no es el problema, se corre bien y es rápido, el problema es en la segunda parte donde en un datagridview se colocan todas las cantidades y descripciones de lo que se necesite es en esa parte cuando empecé a formularla que se me hizo muy lento aunque solo tuviera dos registros, para mi siete segundos es mucho tiempo; si nos ponemos a ver desde el punto de vista del cliente eso resta eficiencia en el proceso y da muy mal aspecto al sistema, si me pueden seguir ayudando gracias
    lunes, 13 de julio de 2015 16:57
  • RESPTANDO las opiniones que me dieron y los caminos a escoger que me dieron termine haciendo asi el codigo que me demoraba:

     sql = "INSERT INTO DETALLES (CANTIDAD, DESCRIPCION) VALUES(@cantidad, @descripcion)"
                Dim comandDet As OleDbCommand = New OleDbCommand(sql, conexion)
                comandDet.Connection.Open()
                For Each FILA As DataGridViewRow In DGNecesidad.Rows
                    comandDet.Parameters.Clear()
                    comandDet.Parameters.AddWithValue("@cantidad", FILA.Cells(0).Value)
                    comandDet.Parameters.AddWithValue("@descripcion", FILA.Cells(1).Value)
                    comandDet.ExecuteNonQuery()
                Next
                comandDet.Connection.Close()
    se redujo el tiempo a dos y tres segundos, que para mi es satisfactorio, gracias todos por su ayuda.

    • Propuesto como respuesta RHCRD lunes, 13 de julio de 2015 17:21
    • Marcado como respuesta Karen MalagónModerator lunes, 13 de julio de 2015 20:21
    lunes, 13 de julio de 2015 17:04