none
Aplicando ODAC RRS feed

  • Pregunta

  • Hola

    Una consulta tengo un sistema que le voy a dar mantenimiento y usa el conector System.Data.OracleClient, el cual me hace mucho recorrido de código cuando se trabaja con store procedure me refiero a los parámetros y los tipos de datos

     System.Data.OracleClient

    Capa datos

    Public Function Get_All2(ByVal objEnt As Ent_Parametros) As Object
            Dim dr As OracleDataReader = Nothing
            With mobj_connectCinDB
                If .QuerySP( _
                               Nothing, _
                               "TAQ.TAQP_FUNCION.TAQSPS_GETPELICULA_VIP", _
                               dr, _
                               .AddSPParam("P_CURSOR", clsConexion.MY_DATA_TYPE.DT_CURSOR, clsConexion.MY_DIRECTION.DIR_OUTPUT, 0, Nothing), _
                               .AddSPParam("PSTR_COMPLEJO", clsConexion.MY_DATA_TYPE.DT_VARCHAR, clsConexion.MY_DIRECTION.DIR_INPUT, 0, objEnt.Str_Param1), _
                               .AddSPParam("PSTR_FECHA", clsConexion.MY_DATA_TYPE.DT_VARCHAR, clsConexion.MY_DIRECTION.DIR_INPUT, 0, objEnt.Str_Param2), _
                               .AddSPParam("PSTR_PELICULA", clsConexion.MY_DATA_TYPE.DT_VARCHAR, clsConexion.MY_DIRECTION.DIR_INPUT, 0, objEnt.Str_Param3), _
                               .AddSPParam("PSTR_TIPO_VENTA", clsConexion.MY_DATA_TYPE.DT_VARCHAR, clsConexion.MY_DIRECTION.DIR_INPUT, 0, objEnt.Str_Param4), _
                               .AddSPParam("PSTR_LOTE", clsConexion.MY_DATA_TYPE.DT_VARCHAR, clsConexion.MY_DIRECTION.DIR_INPUT, 0, objEnt.Str_Param5), _
                               .AddSPParam("PSTR_CAJA", clsConexion.MY_DATA_TYPE.DT_VARCHAR, clsConexion.MY_DIRECTION.DIR_INPUT, 0, objEnt.Str_Param6), _
                               .AddSPParam("PSTR_TIPO", clsConexion.MY_DATA_TYPE.DT_VARCHAR, clsConexion.MY_DIRECTION.DIR_INPUT, 0, objEnt.Str_Param7), _
                               .AddSPParam("PSTR_SECUENCIA", clsConexion.MY_DATA_TYPE.DT_VARCHAR, clsConexion.MY_DIRECTION.DIR_INPUT, 0, objEnt.Str_Param8), _
                               .AddSPParam("PSTR_VTA_MANUAL", clsConexion.MY_DATA_TYPE.DT_VARCHAR, clsConexion.MY_DIRECTION.DIR_INPUT, 0, objEnt.Str_Param9), _
                               .AddSPParam("PSTR_FUNCION_VIP", clsConexion.MY_DATA_TYPE.DT_VARCHAR, clsConexion.MY_DIRECTION.DIR_INPUT, 0, objEnt.Str_Param10)) = False Then
                    'mErrorMsg = .ErrorMsg
                    Return Nothing
                End If
            End With
            mobj_connectCinDB = Nothing
            Return dr
        End Function

    Ejecutando ese metodo Get_All2 en la parte de los parametros llama a la clase clsConexión y la cual se encuentra en otro proyecto peor aun y en la clase clsConexion llama a los siguientes métodos

    Public Class clsConexion
    
        Public Enum MY_DATA_TYPE
            DT_CURSOR
            DT_ROWID
            DT_VARCHAR
            DT_NUMBER
            DT_DATETIME
        End Enum
    
        Public Enum MY_DIRECTION
            DIR_INPUT
            DIR_OUTPUT
            DIR_INPUTOUTPUT
            DIR_RETURNVALUE
        End Enum

    En cada linea de código de cada parámetro va hacia la capa conexión y por cada tipo de dato y direccion del parametro sea input o otpu o inputouput se hace mucho recorrido y por todo ese bloque de parámetros del método que muestro es una locura, Leandro con esto soluciono esa parte de la conexión y recomendaría dejar de usar el imports system.data.oracleClient y usar el ODAC

    NOTA: Otra cosa este sistema obtiene la cadena de conexión en las capas(Presentación, Lógica negocio, Acceso datos) eso también tengo que solucionar

    Me olvidaba falta el QuerySP que es una function :

    Public Function QuerySP(ByRef objTransaction As clsTransaccion, _
              ByVal strSPName As String, ByRef dr As OracleDataReader, _
              ByVal ParamArray pParams() As clsParametroSP) As Boolean
    
            Dim cmdOra As OracleCommand
            Dim blnHasRows As Boolean
    
            If objTransaction Is Nothing Then
                If Open(intTipConexion) = False Then Return -1
            End If
    
            Try
                If intTipConexion = 0 Then
                    cmdOra = BuildSPCommandOra(objTransaction, strSPName, pParams)
                    dr = cmdOra.ExecuteReader()
                    blnHasRows = dr.HasRows
                    If blnHasRows = True Then
                        cmdOra.Dispose()
                        'Close()
                    Else
                        mErrorMsg = "No se pudo recuperar data de la base de datos "
                        Return False
                    End If
                End If
    
                Return blnHasRows
    
            Catch ex As Exception
                mErrorMsg = "No se pudo recuperar data de la base de datos: " & vbCrLf & ex.Message
                Return False
            End Try
    
            Return True
    
        End Function

    Lo que eta marcado con negrita Transaction me lleva a esta clase que esta en capa Conexion. Leandro ese método Query lo que hace es controlar si la transaccion se guardo o no para aplicar transaction eso tranquilamente lo puedo controlar con transacction scope y elimino la function Query y me evito entrar a la clase clsTransaction

    Imports System.Data.OracleClient
    Imports System.Data.SqlClient
    
    Public Class clsTransaccion
    
        Private mTransaccionOra As OracleTransaction
        Private mTransaccionSql As SqlTransaction
        Private intTipConexion As Integer
        Private mConexion As clsConexion
    
        Public Property TransaccionOra() As OracleTransaction
            Get
                Return mTransaccionOra
            End Get
            Set(ByVal value As OracleTransaction)
                mTransaccionOra = value
            End Set
        End Property
    
        Public Property TransaccionSql() As SqlTransaction
            Get
                Return mTransaccionSql
            End Get
            Set(ByVal value As SqlTransaction)
                mTransaccionSql = value
            End Set
        End Property
    
        Public Property Conexion() As clsConexion
            Get
                Return mConexion
            End Get
            Set(ByVal value As clsConexion)
                mConexion = value
            End Set
        End Property
    
        Public Sub Commit()
            Select Case intTipConexion
                Case 0
                    mTransaccionOra.Commit()
                Case 1
                    mTransaccionSql.Commit()
            End Select
        End Sub
    
        Public Sub RollBack()
            Select Case intTipConexion
                Case 0
                    mTransaccionOra.Rollback()
    
                Case 1
                    mTransaccionSql.Rollback()
            End Select
        End Sub
    
        Public Sub Dispose()
            Select Case intTipConexion
                Case 0
                    mTransaccionOra.Dispose()
                Case 1
                    mTransaccionSql.Dispose()
            End Select
        End Sub
    
        Public Sub New(ByRef objConn As clsConexion, Optional ByVal intTipConexion_ As Integer = 0)
            mConexion = objConn
            intTipConexion = intTipConexion_
    
            Select Case intTipConexion
                Case 0
                    ' Conexion para Oracle
                    mTransaccionOra = mConexion.ConnectionORA.BeginTransaction()
                Case 1
                    ' Conexion para Sql Server
                    mTransaccionSql = mConexion.ConnectionSQL.BeginTransaction()
            End Select
        End Sub
    End Class

    Utilizando ODAC

    Public Shared Sub GuardarCliente(ByVal cliente As ClienteEntity)
            Try
                Using cn As OracleConnection = Conexion.Conectar("default")
                    cn.Open()
                    Using cmd As OracleCommand = cn.CreateCommand()
                        cmd.CommandText = "Prueba2.pakclientes.usp_addcliente"
                        cmd.CommandType = CommandType.StoredProcedure
                        With cmd.Parameters
                            .Add("int_idcliente", OracleDbType.Int32, ParameterDirection.Input).Value = cliente.IdCliente
                            .Add("str_ruc", OracleDbType.Varchar2, 11, ParameterDirection.Input).Value = cliente.Ruc
                            .Add("str_nombre", OracleDbType.Varchar2, 80, ParameterDirection.Input).Value = cliente.Nombre
                            .Add("str_razonsocial", OracleDbType.Varchar2, 100, ParameterDirection.Input).Value = cliente.RazonSocial
                            .Add("str_direccion", OracleDbType.Varchar2, 100, ParameterDirection.Input).Value = cliente.Direccion
                        End With
                        cmd.ExecuteNonQuery()
                    End Using
                End Using
            Catch ex As Exception
                Throw New ArgumentException("Error", ex)
            End Try
        End Sub

    Me evitaria ira a clase clsConexion y recorrer los tipos de datos, parametro de entrada o salida, etc y sobre el QuerySP analizandolo es una funcion para controlar el transacction el cual puedo solucionar con transaction scope si me pueden dar una opinión sobre la function  QuerySP para mi controla el transacction alguna otra opinion sera bienvenida




    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    domingo, 7 de abril de 2013 23:41

Respuestas

  • hola

    1- ODAC te da la libreria que implementa ado.net para oracle, es identica a cualqueir otra implementacion de ado.net como ser para Sql server

    no tiene nada que ver con clsConexion

    2- si puedes

    TransactionScope (Clase)

    este esta disponible desde .net 2.0

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta Pedro Ávila lunes, 8 de abril de 2013 2:44
    lunes, 8 de abril de 2013 2:30

Todas las respuestas

  • hola

    no se si entendi el planteo, o la pregunta

    creo que habias realido anteriormente una pregunta en dodne habias puesto este codigo y se habia comentado que la tecnica que tu usabas en el GuardarCliente() era mejor que la clase de conexion

    pero no se que esperas que digamos ahora

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 8 de abril de 2013 1:56
  • Leandro me refiero que con la tecnica qeu me acabas de enseñar para conectrame a la db y me de todos los tipos de datos y no hacer lo que hace la clase conexión y tambien el metodo QuerySP es solo para controlar el transacction eso lo puedo controlar con el transaction scope.

    1. Sobre la conexión el ODAC me da todo lo que hace clsConexion quería que me confirmes para estar seguro

    2. Sobre QuerySP segun lo qeu veo es para controlar el transaction que lo puedo resolver con el transaction scope nose si con el VS 2005 puedo usar el transaction scope? y si en esta funcion hace algo mas de controlar el transaction.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    lunes, 8 de abril de 2013 2:05
  • hola

    1- ODAC te da la libreria que implementa ado.net para oracle, es identica a cualqueir otra implementacion de ado.net como ser para Sql server

    no tiene nada que ver con clsConexion

    2- si puedes

    TransactionScope (Clase)

    este esta disponible desde .net 2.0

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta Pedro Ávila lunes, 8 de abril de 2013 2:44
    lunes, 8 de abril de 2013 2:30