Foros del Web » Programando para Internet » ASPX (.net) »

ejecutar procedimientos almacenados desde servicios web.

Estas en el tema de ejecutar procedimientos almacenados desde servicios web. en el foro de ASPX (.net) en Foros del Web. Holas, desde una aplicacion c# quiero ejecutar un procedimeinto almacenado de oracle via un servicio web, cual seria la mejor forma de realizar esto? estoy ...
  #1 (permalink)  
Antiguo 21/03/2006, 15:00
 
Fecha de Ingreso: noviembre-2004
Mensajes: 48
Antigüedad: 19 años, 5 meses
Puntos: 0
ejecutar procedimientos almacenados desde servicios web.

Holas,

desde una aplicacion c# quiero ejecutar un procedimeinto almacenado de oracle via un servicio web, cual seria la mejor forma de realizar esto? estoy utilizando procedimientos almacenados por que ahi controlo la integridad referencial de mis tablas con transacciones.

el problema es que no puedo pasarle al webmethod del servicio web parametros tipo command u objetos parameter por que no son serializables. Como podria pasarle al webmethod los parametros?

Estoy seguro que mas de uno quiso hacer esto. alguien que tiene la solución?
  #2 (permalink)  
Antiguo 22/03/2006, 02:14
Avatar de javiermil  
Fecha de Ingreso: agosto-2004
Mensajes: 509
Antigüedad: 19 años, 8 meses
Puntos: 2
Hola, no sé muy bien cual es tu problema pero yo lo hago así

Dim results() As Object = Me.Invoke("ServicioWeb", New Object() {var1,var2,var3})

y después en el servicio web

<WebMethod()> Public Function ServicioWeb(ByVal var1 As object,byval var2 as object,byval var3 as object) As DataSet

End Function

No sé si esto resuelve tu duda. Saludos
  #3 (permalink)  
Antiguo 22/03/2006, 02:23
 
Fecha de Ingreso: noviembre-2005
Mensajes: 129
Antigüedad: 18 años, 5 meses
Puntos: 0
declaras un objeto de tipo Command, q para Oracle creo que debes utilizar el OleDbCommand:

OleDbCommand cmd = new OleDbCommand("nombre_proc_almacenado", objConnection);

cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new OleDbParameter("@_nombreParametro", DbType.varchar, 100)).Value = "hola";


y después para ejecutarlo:

cmd.ExecuteReader(); o
cmd.ExecuteNonQuery();

etc...
y así, espero te sea de ayuda...
  #4 (permalink)  
Antiguo 22/03/2006, 19:42
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
Obviamente no se serializan, la forma limpia de hacer es crear un método por ejemplo que se llame AddIn que reciba los parámetros de entrada que necesitas y otro llamado por ejemplo AddOut..

algo así:

Cita:
[WebMethod]
public void AddInParameter(string name, DbType dbType, object value)
{
//aqui los recibes y los trabajas desde tu WS..
}

[WebMethod]
public void AddOutParameter(string name, DbType dbType, object value)
{
//aqui los recibes y los trabajas desde tu WS..
}
Y ya lo mandas a llamar despues de instanciar tu proxy quedando algo así:

Cita:
...
...
myWS.AddInParameter("@param1", DbType.Int32, valor);
Esa sería mas o menos la idea... espero haberme dado a entender

Salu2
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net
  #5 (permalink)  
Antiguo 23/03/2006, 09:53
 
Fecha de Ingreso: mayo-2004
Ubicación: Guadalajara, Jalisco, México
Mensajes: 724
Antigüedad: 20 años
Puntos: 6
Hola rootK, sabes... vi tu respuesta y no mee parecio optima... Nosé.. invocar el metodo para ir agregan los parametros no se me hace una buena solucion...

Que haría yo en ese caso?

Bueno.. se me ocurre tener un xsd dentro de mi web service.. Y que el web service reciba un xml como peticion... como tu sabes.. el xml tiene el nombre de los campos (tags) y los valores (contenido de los tags) es decir...

<Usuario>
<ID>555</ID>
<Nombre>Maria</Nombre>
</Usuario>

Dentro de tu WS cargas tu xsd dentro de un xmldataDocument cargas el xml que recibe tu WS.. es decir.. la peticion...., tendrias que tener una funcion que te genere la lista de campos que estan en un xmldatadocument que estarán soportados en tu procedimiento almacenado...

algo asi...

Private Function getParameters(ByVal request As XmlElement) As NameValueCollection
Dim parameters As NameValueCollection
Dim xmlParameters As XmlNode = request
If Not xmlParameters Is Nothing Then
parameters = New NameValueCollection
For Each Node As XmlNode In xmlParameters
parameters.Add(Node.Name, Node.InnerText)
Next
End If
Return parameters
End Function


y cuando vayas a ejecutar tu SP recorrer lo que te regresa la funcion getParameters...

Public Function getResponse(ByVal spName As String, ByVal spParameters As NameValueCollection, ByVal nameService As String, ByVal nameTransacction As String) As DataSet
Dim sqlDa As SqlDataAdapter = New SqlDataAdapter(spName, AppSettings("Connection"))

'sqlDa.TableMappings.Add()

'sqlAdapter.TableMappings.Add("Table", ActivitiesData.TBL_ACTIVITIES)
With sqlDa.SelectCommand
.CommandType = CommandType.StoredProcedure
For i As Integer = 0 To spParameters.Count - 1
Dim sqlParam As New SqlParameter("@" & spParameters.GetKey(i), spParameters.GetValues(i)(0))
.Parameters.Add(sqlParam)
Next
End With
'Pasar el nombre del servicio
Dim ds As New DataSet
ds.ReadXmlSchema(HttpContext.Current.Request.Physi calApplicationPath & "/" & String.Format(AppSettings("responseFileXSD"), nameService, nameTransacction))
Dim index As Integer = 0
For Each tbl As DataTable In ds.Tables
sqlDa.TableMappings.Add("Table" & IIf(index = 0, "", index.ToString), tbl.TableName)
index += 1
Next
sqlDa.Fill(ds)
Return ds
End Function


Espero te sirva...
Saludos
  #6 (permalink)  
Antiguo 24/03/2006, 09:28
 
Fecha de Ingreso: noviembre-2004
Mensajes: 48
Antigüedad: 19 años, 5 meses
Puntos: 0
Bueno, esto todavia esta para discusion,

Utilizar servicios web se me ocurrio por que actualmente estoy desarrollando aplicaciones con windows forms con c# y bd oracle. No quiero instalar el cliente oracle en todos mis clientes que son como 50. Bueno al final pude solucionarlo con servicios web. Pero mis webmethods en mi servicio web solo actualizan una sola tabla, y muchas veces deseo actualizar en una sola transaccion mas de una tabla por ejemplo maestro/detalle o algo asi

- insert into tabla_maestro values ...
- insert into tabla_detalle values......
- update tabla_otra ...
- update otra tabla ....

pense que crear procedimientos almacenados que hagan toda esta transaccion solucionaria el problema, pero encontre ese problema de la serializacion.

Ahora encontr una solucion transitoria enviandole al webmethod un dataset con todas las tablas que pertenecen a la transaccion y en el webmethod crear mis adpatadores y commandbuilder y objeto transaccion para ejecutar toda mi transaccion. pero tambien tuve problemas con las tablas en las que solo deseo realizar update's.

Alguien tiene una solucion distinta? porfa....
  #7 (permalink)  
Antiguo 24/03/2006, 09:47
 
Fecha de Ingreso: mayo-2004
Ubicación: Guadalajara, Jalisco, México
Mensajes: 724
Antigüedad: 20 años
Puntos: 6
Si.. enviale el xml... en el xml que le puedes enviar a tu ws, pueden ir 2 ó más tablas...

Cuando el ws reciba la peticion, cargas el xsd que tengas a un datasetm y le cargas los datos del xml... ya que hagas eso.. puedes actualizarlo a tu bd..

espero te sirva... Salu2
  #8 (permalink)  
Antiguo 24/03/2006, 10:03
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
Cita:
Iniciado por stream
Hola rootK, sabes... vi tu respuesta y no mee parecio optima... Nosé.. invocar el metodo para ir agregan los parametros no se me hace una buena solucion..
Estoy de acuerdo, solo que mi ejemplo fue mas que nada para demostrar cual sería una de las formas para usar los parámetros en un WS y la forma de serializarlo con un XML claro que es mejor

Salu2
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:06.