none
Error converting data type nvarchar to decimal

    Pregunta

  • cordial saludo

    se me presenta el siguiente error "Error converting data type nvarchar to decimal" y posterior a este me aparece este: " refeerencia a objeto no establecida como instancia de un objeto"

    mi codigo es el siguiente:


    en sql 

    ALTER proc [dbo].[calculos]
    @buscar varchar(15),
    @Estado varchar (10),
    @SobreTasaMA decimal(4,4),
    @SobreTasaBom decimal(4,4)
    
    as
    BEGIN
    
     SET NOCOUNT ON;
    
    select ISNULL(AvaluoPredioHistorico.Año,0) AS  'Año', ISNULL(AvaluoPredioHistorico.ValorAvaluo,0) AS  'Valor Avaluo', 
    ISNULL(AvaluoPredioHistorico.Tarifa,0) AS 'Tarifa', 
    ISNULL(AvaluoPredioHistorico.ValorAvaluo * AvaluoPredioHistorico.Tarifa,0) AS  'ImpuestoPredial' , 
    ISNULL(AvaluoPredioHistorico.ValorAvaluo * AvaluoPredioHistorico.Tarifa * (@SobreTasaMA) , 0) as 'SobreTasaMa',
    ISNULL(AvaluoPredioHistorico.ValorAvaluo * AvaluoPredioHistorico.Tarifa * (@SobreTasaBom) , 0) as 'SobreTasaBom'
    
    from AvaluoPredioHistorico
      WHERE (@Buscar like AvaluoPredioHistorico.CodigoPredio)
    		AND (AvaluoPredioHistorico.Estado=@Estado)
    			END

    Y en VB:NET  es el siguiente:

    Public Function MostrarCalculos() As DataTable
            Try
    
                Conectado()
                cmd = New SqlCommand("calculos")
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Connection = cnn
    
                cmd.Parameters.AddWithValue("@Buscar", txt_codigoPredio.Text)
                cmd.Parameters.AddWithValue("@Estado", "No Pago")
                cmd.Parameters.AddWithValue("@SobreTasaMA", txt_STMA.Text)
                cmd.Parameters.AddWithValue("@SobreTasaBom", txt_STBom.Text)
    
    
    
                If cmd.ExecuteNonQuery Then
                    Dim DT As New DataTable
                    Dim DA As New SqlDataAdapter(cmd)
                    DA.Fill(DT)
                    Return DT
                Else
                    Return Nothing
    
                End If
    
            Catch ex As Exception
                MsgBox(ex.Message)
                Return Nothing
            Finally
                Desconectado()
    
            End Try
        End Function

    creo q el error radica en que al enviar la informacion de VB.NET esta la envia en forma de texto y yo la necesito de tipo numerica (decimal) en este caso para que se pueda realizar los calculos matematicos en sql

    cual es el Error?

    como hago par enviar la los datos de forma numérica??


    JorgeLeonardoDC

    lunes, 3 de octubre de 2016 22:06

Respuestas

  • Hola JorgeLeonardoDC,

    El error es que envías un valor de tipo cadena a un parámetro que necesita un valor decimal.

    Prueba haciendo estos cambios :

    - En el StoredProcedure cambiarías el @buscar por @Buscar.

    ALTER proc [dbo].[calculos]
    @Buscar varchar(15),
    @Estado varchar (10),
    @SobreTasaMA decimal(4,4),
    @SobreTasaBom decimal(4,4)
    AS
    ....

    Además, podrías usar solo el SQLDataAdapter para obtener la información sin el uso del SQLCommand.

         Public Function MostrarCalculos() As DataTable
            Try
                Using con As New SqlConnection("MiCadenaConexion")
                    con.Open()
    
                    Dim da As New SqlDataAdapter("calculos", con)
                    da.SelectCommand.CommandType = CommandType.StoredProcedure
    
                    da.SelectCommand.Parameters.AddWithValue("@Buscar", txt_codigoPredio.Text)
                    da.SelectCommand.Parameters.AddWithValue("@Estado", "No Pago")
                    da.SelectCommand.Parameters.AddWithValue("@SobreTasaMA", CDec(txt_STMA.Text))
                    da.SelectCommand.Parameters.AddWithValue("@SobreTasaBom", CDec(txt_STBom.Text))
    
                    Dim DT As New DataTable
                    da.Fill(DT)
    
                    Return DT
                End Using
            Catch ex As Exception
                MsgBox(ex.Message)
                Return Nothing
            End Try
        End Function

    Con el CDec(...) conviertes el valor del TextBox a decimal.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    lunes, 3 de octubre de 2016 22:27
  • JorgeLeonardoDC,

    Puedes definir un formato de número con dos posiciones decimales:

    dataGridView1.Columns("NombreColumna").DefaultCellStyle.Format = "N2"


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 5 de octubre de 2016 15:21

Todas las respuestas

  • Hola JorgeLeonardoDC,

    El error es que envías un valor de tipo cadena a un parámetro que necesita un valor decimal.

    Prueba haciendo estos cambios :

    - En el StoredProcedure cambiarías el @buscar por @Buscar.

    ALTER proc [dbo].[calculos]
    @Buscar varchar(15),
    @Estado varchar (10),
    @SobreTasaMA decimal(4,4),
    @SobreTasaBom decimal(4,4)
    AS
    ....

    Además, podrías usar solo el SQLDataAdapter para obtener la información sin el uso del SQLCommand.

         Public Function MostrarCalculos() As DataTable
            Try
                Using con As New SqlConnection("MiCadenaConexion")
                    con.Open()
    
                    Dim da As New SqlDataAdapter("calculos", con)
                    da.SelectCommand.CommandType = CommandType.StoredProcedure
    
                    da.SelectCommand.Parameters.AddWithValue("@Buscar", txt_codigoPredio.Text)
                    da.SelectCommand.Parameters.AddWithValue("@Estado", "No Pago")
                    da.SelectCommand.Parameters.AddWithValue("@SobreTasaMA", CDec(txt_STMA.Text))
                    da.SelectCommand.Parameters.AddWithValue("@SobreTasaBom", CDec(txt_STBom.Text))
    
                    Dim DT As New DataTable
                    da.Fill(DT)
    
                    Return DT
                End Using
            Catch ex As Exception
                MsgBox(ex.Message)
                Return Nothing
            End Try
        End Function

    Con el CDec(...) conviertes el valor del TextBox a decimal.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    lunes, 3 de octubre de 2016 22:27
  • ya esta resuelto pero pido otra ayuda..

    como se puede ver en la imagen es el DataGridView donde ya tengo los valores que necesito, ahora quiero q me los muestre con solo dos decimales (solo mostrar, para no afectar los cálculos)

    como lo hago??


    JorgeLeonardoDC


    miércoles, 5 de octubre de 2016 14:51
  • gracias

    la solución fue agregarle el CDec(


    JorgeLeonardoDC

    miércoles, 5 de octubre de 2016 14:58
  • JorgeLeonardoDC,

    Puedes definir un formato de número con dos posiciones decimales:

    dataGridView1.Columns("NombreColumna").DefaultCellStyle.Format = "N2"


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 5 de octubre de 2016 15:21
  • se me presentó un inconveniente

     DataGridViewPago.Columns("ValorAvaluo").DefaultCellStyle.Format = "N2"

    me aparece este error:

    "referencia a objeto no establecida como instancia de un objeto"

    pero solo es con esta columna, la columna es de tipo int.


    JorgeLeonardoDC

    miércoles, 5 de octubre de 2016 16:48
  • JorgeLeonardoDC,

    ¿Es posible que el nombre de la columna 'ValorAvaluo' no exista o no este escrito correctamente?


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 5 de octubre de 2016 17:08