none
No coinciden los datos en la expresión de criterios

    Question

  • Buen día
    primero que todo tengo que comenzar diciendo: que soy bastante inexperto en esto de visual basic.

    En este momento estoy desarrollando un aplicativo de visual studio 2010 que conecta con base de datos access 2010 y tengo un formulario llamado Tbl_Ingresos.

    En este formulario tengo controles datetime pikeck, combos y textbox y pretendo que parte de los controles me traiga la informacion de otra tabla que se llama Tbl_tipo de ingreso. Posteriormente con la informacion traida de esta tabla le digito datos en los demas controles y procedo a actualizar mi tabla Tbl_Ingresos.

    Cabe anotar que ya pude traer mi informacion de la tabla Tbl_tipo de ingreso, el problema es al insertar estos datos en la tabla Tbl_Ingresos me genera el error, no coinciden los tipos de datos en la expresión de criterios.

    Mi codigo es el Siguiente:

    'Se declaran las variables como globales para todo el formulario con esto pueden ser usadas en cualquier control de formulario
    Public ingresostableadapter As OleDbDataAdapter
    Public ingresosdataset As DataSet
    Public fingresostableadapter As OleDbDataAdapter
    Public fingresosdataset As DataSet
    Public miconexion As OleDbConnection

    '2. Al ingresar el formulario realiza conexion con la base datos y rellena desde la tabla de Tipo de Ingresos, los datos de tipo de ingreso y su cuenta puc correspopndiente
    miconexion = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0 ;Data Source=C:\Users\AMP\Documents\Visual Studio 2010\Projects\Medisoft\Basededatos_Medisoft.accdb; Persist Security Info=True;Jet OLEDBatabase Password=1234")
    ingresostableadapter = New OleDbDataAdapter
    ingresostableadapter.SelectCommand = New OleDbCommand("SELECT * FROM Tbl_Tipo_de_ingreso", miconexion)

    ingresosdataset = New DataSet
    ingresosdataset.Tables.Add("Tbl_Tipo_de_ingreso")
    ingresostableadapter.Fill(ingresosdataset.Tables(" Tbl_Tipo_de_ingreso"))

    Cbb_tipodeingreso.DataSource = ingresosdataset.Tables("Tbl_Tipo_de_ingreso")
    Cbb_tipodeingreso.DisplayMember = "Descripcion ingreso"
    Txt_cuentapuc.DataBindings.Add("text", ingresosdataset.Tables("Tbl_Tipo_de_ingreso"), "Cuenta PUC")
    Txt_descripcion.DataBindings.Add("text", ingresosdataset.Tables("Tbl_Tipo_de_ingreso"), "Descripcion PUC"
    End Sub

    Private Sub Opt_guardar_ingreso_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Opt_guardar_ingreso.Click

    miconexion = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0 ;Data Source=C:\Users\AMP\Documents\Visual Studio 2010\Projects\Medisoft\Basededatos_Medisoft.accdb; Persist Security Info=True;Jet OLEDBatabase Password=1234")
    Dim cmd As New OleDbCommand("INSERT INTO Tbl_Ingresos (recibo, fechaingreso, tipoingreso, ctapuc, descripcionpuc, Concepto, Valor, fecharegistro) VALUES('" & Txt_Norecibodecaja.Text & "','" & Dt_fechaingreso.Value & "', '" & Cbb_tipodeingreso.Text & "', '" & Txt_cuentapuc.Text & "', '" & Txt_descripcion.Text & "', '" & Txt_concepto.Text & "', '" & Txt_valor.Text & "', '" & Dt_fecharegistro.Value & "')", miconexion)
    miconexion.Open()
    cmd.ExecuteNonQuery()
    miconexion.Close()

    End Sub
    Wednesday, February 13, 2013 9:49 PM

All replies

  • Hola.

    En primer lugar te recomendaria que te olvides de concatenar los parametros, ese es una mala practica, debes usar en su lugar usar  parametros.

    Tu codigo quedaria algo asi, adaptalo a tu necesidad:

    Dim Db As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath & "\Db\Datos.mdb")
            Dim iSql As String
            Try
                iSql = "INSERT INTO Datos(Codigo,Servidor,Usuario,Pass,Base ) VALUES(@Codigo,@Servidor,@Usuario,@Pass,@Base)"
              
                Dim oCommand As New OleDbCommand(iSql, Db)
                oCommand.CommandType = CommandType.Text
                oCommand.Parameters.AddWithValue("@Servidor", Me.TextEdit1.Text)
                oCommand.Parameters.AddWithValue("@Usuario", Me.TextEdit2.Text)
                oCommand.Parameters.AddWithValue("@Pass", Me.TextEdit3.Text)
                oCommand.Parameters.AddWithValue("@Base", "Farm")
                Db.Open()
                oCommand.ExecuteNonQuery()
                Db.Close()

    Como vez usando parametros el codigo queda mucho mas entendible.

    Ahora con respcto al error que te sle, es bastante obvio, estas pasando como parametro un valor que no se ajusta al tipo de dato de tu parametro, debes de verificar eso.

     

    Luis Muñoz Hidalgo
    Mi Blog
    Desarrollador de Software
    Trujillo-Perú


    Thursday, February 14, 2013 5:28 AM
  • Buen Dia 

    Luis F. 

    Primero que todo muchas todos los ejemplos de buenas practicas de programacion son bienvenidos, y entiendo que parametrizando se crea una mejor y mas consistente consulta.

    Hice lo que me recomendaste dejando mi codigo de la siguiente manera:

    Dim miconexion As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\AMP\Documents\Visual Studio 2010\Projects\Medisoft\Basededatos_Medisoft.accdb;Persist Security Info=True;Jet OLEDB:Database Password=1234")

            Dim sql As String

            Try

                sql = "INSERT INTO Tbl_Ingresos (recibo, fechaingreso, tipoingreso, ctapuc, descripcionpuc, Concepto, Valor, fecharegistro) VALUES(@recibo,@fechaingreso,@tipoingreso,@ctapuc,@descripcionpuc,@concepto,@valor,@fecharegistro)"

                Dim cmd As New OleDbCommand(sql, miconexion)

                cmd.CommandType = CommandType.Text

                cmd.Parameters.AddWithValue("@recibo", Me.Txt_Norecibodecaja.Text)

                cmd.Parameters.AddWithValue("@fechaingreso", dt_fechaingreso.value)

                cmd.Parameters.AddWithValue("@tipoingreso", Me.Cbb_tipodeingreso.Text)

                cmd.Parameters.AddWithValue("@ctapuc", Me.Txt_cuentapuc.Text)

                cmd.Parameters.AddWithValue("@descripcionpuc", Me.Txt_descripcion.Text)

                cmd.Parameters.AddWithValue("@concepto", Me.Txt_concepto.Text)

                cmd.Parameters.AddWithValue("@valor", Me.Txt_valor.Text)

                cmd.Parameters.AddWithValue("@fecharegistro", dt_fecharegistro.value)

                miconexion.Open()

                cmd.ExecuteNonQuery()

                miconexion.Close()

                MsgBox("ha guardado exitosamente")

                borrar()

            Catch ex As OleDbException

                MessageBox.Show(ex.Message)

                End

            End Try

    y ahora me genera el siguiente error no coinciden los datos en la expresion de criterios, creo que es por los DateTimePicker pero no se exactamente como corregir el error.

    Que pena abusar de tu confianza me podrias ayudar con error en la sintaxis para corregir dicho error.

    Agradezco Nuevamente tu ayuda bendiciones.

    Thursday, February 14, 2013 10:06 PM
  • Hola.

    Pues si estas utilizando fechas como parametro, el addWithValue para el tipo de dato DateTime, presenta hay un problemita, debemos de declarar el parametro e indicarlo el tipo de dato Date. En pocas palabras cuando se quiera pasar un parametro con tipo de dato DateTime debemos declarar el parametro, ya que el AddWithValue no encuentra el tipo de dato correcto a asignar,

     Algo asi deberias usar.

    Dim param As New OleDbParameter("@FechaNacimiento", OleDbType.Date)
    param.Value = CDate(me.dtpFechaNacimiento.value.date)
    command.Parameters.Add(param)

    Ahora si el problema persiste, puede ser que tengas el OptionScritc activado, esto quiere decir que debes de convertir de manera forzada los tipos de datos cuando pases un parametro.

    Para las Fechas deberias usar el Cdate para convertir

    Para los Enteros debes usar el Cint para convertir

    Para los Double debes usar el CDbl

    Saludos.


    Luis Muñoz Hidalgo
    Mi Blog
    Desarrollador de Software
    Trujillo-Perú

    Friday, February 15, 2013 2:03 AM
  • Hombre!!!

    Mil y mil gracias Bendiciones¡¡¡¡¡

    Me funciono Master perfectamente, ahora me surge una duda el tipo de parametrizacion tambien se debe usar de la misma manera en una consulta Select o SelectMAX??

    Me podrias regalar un ejemplo..

    de nuevo Graciaaaaaaaasssssss

    Sunday, February 17, 2013 8:27 PM
  • ahora me surge una duda el tipo de parametrizacion tambien se debe usar de la misma manera en una consulta Select o SelectMAX?

    en la parte del WHERE de una consulta select si puede hacerlo

    en la parte donde defines los campos que vas a recuperar no


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Monday, February 18, 2013 11:21 AM