Timer detiene depuración para agregar datos a bd

Iniciado por CAEL20, 24 Enero 2018, 23:47 PM

0 Miembros y 1 Visitante están viendo este tema.

CAEL20

Buen dia estoy desarrollando un ejercicio el cual es de buscar extensiones y agregarlas a un ListBox, de ahí programo un timer para que seleccione dato por dato de la lista y la agregue a una base de datos, tengo el problema que agregar unos cuantos y en cierto momento se detiene la depuración marcando error en la linea para agregar datos a la base de datos, les dejo mi ejercicio espero me puedan ayudar.

Código (vbnet) [Seleccionar]
Imports System.IO
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim ExtensionBuscada As String = "*.txt"
        Dim dirInfo As New DirectoryInfo(TextBox1.Text)
        Dim dirsInfo() As DirectoryInfo = dirInfo.GetDirectories("*.*", SearchOption.TopDirectoryOnly)

        For Each di As DirectoryInfo In dirsInfo
            Try
                Dim filesInfo() As FileInfo = di.GetFiles(ExtensionBuscada, SearchOption.AllDirectories)
                For Each fichero As FileInfo In filesInfo
                    ListBox1.Items.Add(fichero.FullName)
                    Label6.Text = ListBox1.Items.Count
                Next

            Catch ex As UnauthorizedAccessException
                ' Controlo el error de acceso no autorizado a carpeta

            End Try
        Next
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Timer1.Start()
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Me.ListBox1.SelectedIndex = 0
        Button2_Click(sender, e)
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        If ListBox1.Items.Count > 0 Then
            Label6.Text = ListBox1.Items.Count
            Me.ListBox1.SelectedIndex = 0
            Label1.Text = ListBox1.SelectedItem.ToString

            Label7.Text = Val(Label7.Text) + Val("1")
            Me.DATOSTableAdapter.Insert(Label7.Text, Label1.Text, Label3.Text, Label4.Text, Label5.Text) 'INSERTAR NUEVO DATOS

            ListBox1.Items.Remove(ListBox1.SelectedItem)



        Else
            Label6.Text = ListBox1.Items.Count
            Me.DATOSTableAdapter.Fill(Me.CAPTURADataSet.DATOS)
            Timer1.Stop()

        End If

    Private Sub DATOSBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DATOSBindingNavigatorSaveItem.Click
        Me.Validate()
        Me.DATOSBindingSource.EndEdit()
        Me.TableAdapterManager.UpdateAll(Me.CAPTURADataSet)

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'TODO: esta línea de código carga datos en la tabla 'CAPTURADataSet.DATOS' Puede moverla o quitarla según sea necesario.
        Me.DATOSTableAdapter.Fill(Me.CAPTURADataSet.DATOS)

    End Sub


End Class





Si funciona, agrega bien pero en cierto tiempo de que agrego algunos detiene la depuración marca error en la linea de agregar a la bd.


Código (vbnet) [Seleccionar]
Me.DATOSTableAdapter.Insert(Label7.Text, Label1.Text, Label3.Text, Label4.Text, Label5.Text) 'INSERTAR NUEVO DATOS


Serapis

No lo pones fácil. Básicamente quieres que adivinemos que error te sucede al introducir unos datos que desconocemos de una carpeta que desconocemos, de unos ficheros que desconocemos, en una base de datos que desconocemos.

Viendo los 'labels', que contienen los supuestos datos a ingresar en la supuesta línea que te falla, (así a ciegas) yo apuntaría que:
1 - El contenido de un label está vacío y la base de datos para ese campo está marcado como 'not null or empty', vamos que no admite una cadena de texto vacía...
2 - O lo contrario, que un campo esté limitado a un máximo de caracteres y esté recibiendo más, aunque en tal caso debiera truncarlo.
3 - Que el campo estuviera reclamando un tipo de datos (por ejemplo numérico), y que hasta el momento el label contenía un dato que puede ser interpretado como numérico, pero más adelante no.

Apostaría por el caso 1, mucho menos por el 2 y remotamente improbable por el 3...

Y ahora pregunto yo. ¿Tanto cuesta poner el error que marca el stacktrace????.
¿Quieres respuestas razonables o apuestas adivinas?...

CAEL20

Si solo quiero guardar las direcciones de archivos que el boton Button1 busca, de ahi el timer es de guardar las direcciones que encontró el buscador y enlisto el label 7 es como el ID y el label 1 la ruta ejemplo D:\carpeta\archivo.txt los demas label son label que lleno con otro contenido, todo va bien y se ejecuta bien pero llega el momento que se detiene la depuración.

Eleкtro

Cita de: CAEL20 en 24 Enero 2018, 23:47 PM
marca error en la linea de agregar a la bd.

Código (vbnet) [Seleccionar]
Me.DATOSTableAdapter.Insert(Label7.Text, Label1.Text, Label3.Text, Label4.Text, Label5.Text) 'INSERTAR NUEVO DATOS

No somos adivinos, ¿cual es el tipo de la excepción, y el mensaje exacto del error?.

Saludos.









Serapis

#5
Cita de: CAEL20 en 25 Enero 2018, 07:38 AM
Si solo quiero guardar las direcciones de archivos que el boton Button1 busca, de ahi el timer es de guardar las direcciones que encontró el buscador y enlisto el label 7 es como el ID y el label 1 la ruta ejemplo D:\carpeta\archivo.txt los demas label son label que lleno con otro contenido, todo va bien y se ejecuta bien pero llega el momento que se detiene la depuración.

Bien, pero tenemos que seguir jugando a adivinar qué pasa, insisto:
Cita de: NEBIRE en 25 Enero 2018, 03:07 AM
... ¿Tanto cuesta poner el error que marca el stacktrace????...
Ya te decía, que sin más detalles no se puede saber que está pasando. Por imaginar, sin detalles lo úniico aventurado señalar es que los datos estén fuera de rango... una cadena vacía donde se espera contenido, un valor numérico dentro de unos límites (si es un byte, que no reciba un entero, etc... incluso si el valor no está acotado en el campo: >20 y < 150 por ejemplo, si el campo está así definido y un valor fuera dle rango, genera un error.

¿Puedes añadir líneas de código de depurración, para controlar las variables implicadas, y ver si tienen el valor que debieran tener?. Depurar es eso... verificar que cada variable contiene el valor que correponde al estado actual y si para ello hay que añadir líneas de control se añaden hasta capturar el error.

¿Por qué no añades un mísero Try...catch (en la línea que dices que falla)? y devuelves la excepción resultante.

Es que no pones ni lo mínimo, que sería el contenido de cada uno de esos labels en el momento del fallo... ...en fín tu pretendes que adivinemos donde tienes un error sin más.



Voy a tomarme la molestia de revisar tu código, a pesar de que es algo a evitar cuando uno no hace lo correcto, dar detalles...

Selecciono el siguiente fragmento de código  (del timer) y me centro sólo en él:
(por cierto, la función de evento del timer, no tiene su correspondiente 'end sub', asumo que sólo es un problema de copy-paste en el foro).

Bien, como tú dices que funciona durante un momento y luego falla, y observo que vas borrando ítems de un listbox, después de insertar los datos, aunque quede vacío, lo controlas antes, luego ahí no hay error...
Solo veo que 'label1' contiene el contenido actual del primer ítem del listbox
Y que el label7, lleva una cuenta (una cuenta fea de llevar, convertir a número y luego a texto, etc.. ese label sería mejor estar soportado en una función o propiedad, como sigue:
Código (vb) [Seleccionar]

private p_cuenta as int32
private function SumaCuenta as string
   p_Cuenta +=1
   return  p_Cuenta.toString
end function


Luego haría falta una línea adicional para controlar la situación... modifica como señalo...

Código (vb) [Seleccionar]

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
       Dim k As Int32

       k = listbox1.items.Count
       If (k > 0) Then
           label6.text = k.ToString
           Label1.Text = ListBox1.Items.Item(0)

           label7.text = SumaCuenta

           Try

               DatosTableAdapter.Insert(Label7.Text, Label1.Text, Label3.Text, Label4.Text, Label5.Text)
               ListBox1.Items.Remove(0)
           Catch ex As Exception
               MessageBox.Show(ex.StackTrace) ' mínimo ex.message
           End Try
       Else
           '...
       End If
   End Sub


Luego ejecuta (paso a paso al llegar al evento del timer) y cuando salte el error, copia el texto del mensaje que salga y pégalo por aquí, a ver si se aclara algo...

Mejor opción es que hagas copia del proyecto, elimina lo que no sea necesario o no te parezca prudente revelar (pero que pueda ejecutarse hasta ahí), y a ver si se puede hacer algo más que adivinar...



Bien acabo de ver el mensaje último (éste lo tenía editado y me tuive que marchar y ahora al volver lo he enviado).
La imagen es clara, como se asume, una conversión de tipos forzada.... tu usas labels que son strings, y alguno de ellas se espera un tipo de datos de otro tipo, que no puede ser convertido, implícitamente, debe hacerse su 'cast' preciso.
...pero ves que en la misma imagen te pone: 'copiar detalles al portapapeles'?... pués eso es lo que hay que hacer y pegar aquí, junto con el código (solo hiciste esta última parte).
Si pones el cursosr sobre el 'guioncito rojo' (al final dle texto), y pinchas en él, te sugiere cambios, tal que si sabes lo que estás haciendo sabrás si en efecto, "vaya se me pasó", o dirás. "Ni P... idea"... si no lo resuelves pon el stacktrace entero...

CAEL20

Gracias por la molestia la verdad no se mucho y menos de sql, este codigo lo aprendi de youtube, vi que el error es por recolectar rutas que superan el MaxLegth le he cambiado y algunas me carga en el DataGridView con signo de rojo por superar el limite, pero si logra llegar al fin de recolección.