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.
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.
Me.DATOSTableAdapter.Insert(Label7.Text, Label1.Text, Label3.Text, Label4.Text, Label5.Text) 'INSERTAR NUEVO DATOS
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?...
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.
Cita de: CAEL20 en 24 Enero 2018, 23:47 PM
marca error en la linea de agregar a la bd.
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.
es asi como me marca
https://drive.google.com/open?id=115_2doDcsiaNTlyjSp3idZBwzwNBHXpS
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:
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...
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...
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.