none
La conversion del tipo 'dbnull' a 'String' no es valida

    Pregunta

  • Hola a todos, tengo un procedimiento almacenado que me entrega los fondos asignados, fondos ocupados y fondos disponibles de un proyecto. el problema es que cuando aun no se solicitan fondos, la consulta me entrega como valores NULL los "Fondos_Ocupados" y los "Fondos_Disponibles". Estos valores los debo mostrar en textbox, pero al ser valores nulos me muestra un error. Al tratar de convertir esos valores nulos en "0" en el caso de "fondos_Ocupados" y que tome el valor de "Fondos_Asignados" en el caso de "Fondos_Disponibles" me arroja el error  "La conversion del tipo 'dbnull' a 'String' no es valida". 

    Les dejo el SP  

    Create procedure SP_Fondos_Asignados_Restantes
    @Centro_Costo varchar(100)
    AS
    BEGIN
    		SET NOCOUNT ON;
    SELECT
    	p.Fondos_Asignados AS [FondoAsignado],
        SUM(e.Monto) AS [FondoOcupado],
        p.Fondos_Asignados - SUM(e.Monto) AS [FondoDisponible]
    FROM
        Tbl_Proyecto p
        LEFT JOIN Tbl_Egresos e ON (p.Centro_Costo = e.Centro_Costo_Proyecto) and (e.Estado = 'Aprobado') 
    	where p.centro_costo like @centro_costo 
    GROUP BY
        p.Fondos_Asignados;
    end

    y el codigo. Saludos

    Private Sub cbx_proyecto_SelectionChangeCommitted(sender As Object, e As System.EventArgs) Handles cbx_proyecto.SelectionChangeCommitted
            Using cn As New SqlConnection(My.Settings.Conexion_Rendiciones)
                cn.Open()
                Try
                    Dim cmd As New SqlCommand("SP_Fondos_Asignados_Restantes", cn)
                    cmd.CommandType = CommandType.StoredProcedure
                    cmd.Parameters.AddWithValue("@Centro_Costo", CStr(cbx_proyecto.SelectedValue))
                    Dim da As SqlDataAdapter = New SqlDataAdapter(cmd)
                    Dim dt As New DataTable
                    da.Fill(dt)
                    If dt.Rows.Count > 0 Then
                        Dim row As DataRow = dt.Rows(0)
                        txt_fondos_asignados.Text = CStr(row("FondoAsignado"))
                        If CStr(row("FondoOcupado")) = Convert.ToString("null") Then
                            txt_fondos_ocupados.Text = "0"
                        Else
                            txt_fondos_ocupados.Text = CStr(row("FondoOcupado"))
                        End If
                        If CStr(row("FondoDisponible")) = Convert.ToString("Null") Then
                            txt_fondos_restantes.Text = CStr(row("FondoAsignado"))
                        Else
                            txt_fondos_restantes.Text = CStr(row("FondoDisponible"))
                        End If
                    End If
                    Load_DatagridView()
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            End Using
        End Sub

     
    viernes, 20 de enero de 2017 15:31

Respuestas

  • Debería ser algo como esto

    	If IsDbNull(row("FondoOcupado") Then
    	   txt_fondos_ocupados.Text = "0"
    	End If

    cuando haces esto 

    Convert.ToString("null") 

    tratas de castear a string la cadena "null" lo cual te va a devoler la cadena "null ",pero el error viene del lado izquierdo de la expresión

    CStr(row("FondoOcupado")) 

    tambien podrías utilizar 

    If Convert.ToString((row("FondoOcupado")) = String.Empty Then

    txtfondosocupados.Text="0"

    End If

    La función Convert.ToString si maneja los nulos que vienen de la base de datos y los reemplaza por un valor de cadena vacía ""

    Tambien podrías considerar por SQl el uso de la función ISNULL



    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.





    • Editado Augusto1982 viernes, 20 de enero de 2017 16:52
    • Marcado como respuesta adriian.91 viernes, 20 de enero de 2017 16:57
    viernes, 20 de enero de 2017 16:38

Todas las respuestas

  • Debería ser algo como esto

    	If IsDbNull(row("FondoOcupado") Then
    	   txt_fondos_ocupados.Text = "0"
    	End If

    cuando haces esto 

    Convert.ToString("null") 

    tratas de castear a string la cadena "null" lo cual te va a devoler la cadena "null ",pero el error viene del lado izquierdo de la expresión

    CStr(row("FondoOcupado")) 

    tambien podrías utilizar 

    If Convert.ToString((row("FondoOcupado")) = String.Empty Then

    txtfondosocupados.Text="0"

    End If

    La función Convert.ToString si maneja los nulos que vienen de la base de datos y los reemplaza por un valor de cadena vacía ""

    Tambien podrías considerar por SQl el uso de la función ISNULL



    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.





    • Editado Augusto1982 viernes, 20 de enero de 2017 16:52
    • Marcado como respuesta adriian.91 viernes, 20 de enero de 2017 16:57
    viernes, 20 de enero de 2017 16:38
  • Tienes un problema aqui:

    CStr(row("FondoOcupado"))

    Cuando la base de datos devuelve NULL, lo que te carga en el row no es la palabra "null" (como parece inferirse de la comparacion que intentas hacer), sino que te devuelve un objeto especial que es de la clase DBNull. Al igual que casi cualquier objeto que sea de una clase, en lugar de ser un simple escalar, no se puede convertir a String con un CSTR. En cambio, si lo deseas (aunque probablemente no sea la solucion ideal), si que puedes convertirlo a string llamando al metodo .ToString:

    If row("FondoOcupado")).ToString() = "System.DBNull"

    Pero esto es una chapuza bastante gorda. Aunque es lo que mas se parece a lo que ya tenias escrito, es preferible que uses las funciones especificas tales coo IsDbNull, como ya te han sugerido en otra respuesta.

    https://msdn.microsoft.com/en-us/library/system.dbnull(v=vs.110).aspx

    Por cierto, dicho sea de paso, Convert.ToString("Null") no vale para nada. "Null" ya es un String, no tiene sentido convertirlo a String.

    viernes, 20 de enero de 2017 16:59
  • Gracias Augusto, muy completa la respuesta.
    viernes, 20 de enero de 2017 17:01