Search code examples
asp.netvb.netoracle-databaseodp.netclob

Get Oracle.DataAccess.Types.OracleClob instead of actual value


I'm having an issue, I'm calling a procedure on oracle 11g, the prucedure receives a clob and responds with a different CLOB, a VARCHAR2 and a Number. The procedure is called from a ASP.NET (on Visual Basic) webpage using oracle data provider (ODP.NET), I can call the procedure successfully, view the VARCHAR2 and NUMBER returned values, but when I try to see the returned value of the returning CLOB all I get is "Oracle.DataAccess.Types.OracleClob" instead of a expecting XML

I know the returned XML is generated because on the store procedure I create a txt file where it shows the expected result

My code it's pretty simple right now:

Function Index() As String 'ActionResult
        Dim xml_message As String

        Dim oradb As String = "Data Source=127.0.0.1;User Id=id;Password=pass;"
        Dim conn As New OracleConnection(oradb)
        Dim oracleDataAdapter As New OracleDataAdapter
        oracleDataAdapter = New OracleDataAdapter()

        Dim cmd As New OracleCommand
        cmd.Connection = conn

        cmd.CommandType = CommandType.StoredProcedure
        cmd.CommandText = "Common.GetDriverPoints"

        cmd.BindByName = True

        Dim driver_input As New OracleParameter()
        driver_input = cmd.Parameters.Add("p_driver", OracleDbType.Clob)
        driver_input.Direction = ParameterDirection.Input
        driver_input.Value = <THE_SENDED_XML_VALUE>

        Dim driver_output As New OracleParameter()
        driver_output = cmd.Parameters.Add("p_output", OracleDbType.Clob)
        driver_output.Direction = ParameterDirection.Output

        Dim error_flag As New OracleParameter()
        error_flag = cmd.Parameters.Add("p_Return", OracleDbType.Int16)
        error_flag.Direction = ParameterDirection.Output

        Dim error_desc As New OracleParameter()
        error_desc = cmd.Parameters.Add("p_ReturnDesc", OracleDbType.Varchar2, 100)
        error_desc.Direction = ParameterDirection.Output

        conn.Open()

        cmd.ExecuteNonQuery()

        Dim output As String
        output = driver_output.Value.ToString() 'This only returns Oracle.DataAccess.Types.OracleClob

        conn.Close()
        conn.Dispose()

        Return output
    End Function

Also, the generated xml is around 55Kb, sometimes it's bigger

Thank you


Solution

  • I manage to find the answer, In case someone have the same problem, basically what has to be done is create another clob, used only on for vb.net, that clob will receive the value of the parameter output from the procedure, then cast to a string variable the local clob.

    Example:

    Dim output As String
    Dim myOracleClob As OracleClob = driver_output.Value
    output = System.Convert.ToString(myOracleClob.Value)
    

    Now the "output" variable holds the actual message of the clob. Hope this helps anybody with the same problem.