none
Uso de ParamArray dentro de una clase RRS feed

  • Pregunta

  • Hola a Todos

    En esta ocasiion necesito de su colaboracion para resolver el siguiente problemita...

    Estoy desarrollando un clase de tipo utilitaria que sirva como capa intermedia entre la interrfaz de usuario y la base de datos. En dicha clase tengo la siguiente funcion

    Public Function SaveRecords(Procedure As String, CommandType As ADODB.CommandTypeEnum, ParamArray Param() As Variant) As ADODB.Recordset
       Set SaveRecords = LoadProcedure(Procedure, CommandType, Param())  
    End Function
    
    
    

    La funcion manda a llamar a otra funcion que me permite ejecutar una sentencia TSQL cuaquiera, pasandole los parametros que requiere a un objecto ADO Command.

    Los parametros son lo siguientes:

    • Procedure: contiene la sentencia TSQL a ejecutar (SELECT, INSERT, UPDATE, SP)
    • CommandType: Identificador del tipo de sentecia a ejecutar, segun lo indicado por ADODB.CommandTypeEnum
    • Param(): listado de parametros a utilizar por la funcion, propiamente dicho para los SP

    Ejemplo:

    Objecto.SaveRecords "PA_SaveRecord", adCmdStoredProc, txtSucursal, txtMonto, txtFecha
    

               
    DOnde
    "PA_SaveRecord", es un procedimiento que se encuentra en el servidor,
    adCmdStoredProc, es un valor que le indica al command el tipo de TSQL a ejecutar
    txtSucursal, txtMonto, txtFecha, son parte de los parametros que recibe "PA_SaveRecord"


    La funcion LoadProcedure simplemente le pasa los parametros de la funcion SaveRecords y ejecuta un objeto command.

    Public Function LoadProcedure(Procedure As String, CommandType As ADODB.CommandTypeEnum, ParamArray Param() As Variant) As ADODB.Recordset
    On Error GoTo ValidateErr
    Dim comMain As ADODB.Command, param2 As Variant
    If cn Is Nothing Then Set cn = New ADODB.Connection
    If cn.State <> adStateOpen Then cn.Open StrConn
    If comMain Is Nothing Then Set comMain = New ADODB.Command
    comMain.CommandType = CommandType
    comMain.CommandText = Procedure
    If UBound(Param(), 1) > 0 Then
      Select Case TypeName(Param(0))
      Case "Integer"
            comMain.Parameters.Append comMain.CreateParameter("IdParam", adInteger, , , Param(0))
      Case "String"
            comMain.Parameters.Append comMain.CreateParameter("IdParam", adBSTR, , Len(CStr(Param(1))), CStr(Param(1)))
      Case "Date"
            comMain.Parameters.Append comMain.CreateParameter("IdParam", adDate, , , Param)  
      End Select
    End If
    comMain.ActiveConnection = cn
    Set LoadProcedure = comMain.Execute
    ValidateErr:
         msgbox MsgBox Err.Description, vbInformation, Err.Source & " - Error Number: " & Err.Number
          Err.clear
    ValidateExit:
    If comMain.State = adStateOpen Then comMain.Cancel
    Set comMain = Nothing
    End Function
    

    Ahora el punto esta que al pasar el Param() de la funcion SaveRecords a la funcion LoadProcedure, este se va como un elemento del arreglo que esta dentro de la funcion LoadProcedure y en este punto no se como acceder a los elementos que se pasaron como parametros por la funcion SaveRecords.

    Agradeceria la ayuda que me puedan brindar en este tema

     

    PD: Anteriormente habia posteado esta misma interrogante en http://www.forosdelweb.com/newreply.php?do=newreply&p=3715408 sin embargo todabia no he podido hallar como resolver.

    Les agradesco de ante mano

    martes, 15 de febrero de 2011 22:43

Todas las respuestas

  • usar el objeto command con parameters es para problemas,yo pasaria directo el sp y los parametros en un string separados por coma para unirlo al sp y hacer un execute
    martes, 15 de febrero de 2011 23:04
  • Si seria una opcion, el asunto que esta funcion puede recibir n parametros, ya que el sentido de la funcion es poder llamar a cualquier SP que esta en el server con su correspondientes parametros y devolver el resultado a la funcion que lo invoco. A como indicaba en el ejemplo:

    Objecto.SaveRecords "PA_SaveRecord", adCmdStoredProc, txtSucursal, txtMonto, txtFecha
    
    Igual podria ser un simple select a una vista o a una tabla
    Saludos
    martes, 15 de febrero de 2011 23:43
  • Si pasas los parametros en un vector o en un string para despues hacer split al tener el ubound del vector sabes si hay parametros y los concatenas al select o al sp
    miércoles, 16 de febrero de 2011 16:58
  • Hola que tal, creo haber leido por ahi que el tipo de un Date es double, o al menos es lo que te bota la funcion TypeName()

    Revisalo saludos

    viernes, 18 de febrero de 2011 19:19