2017-08-08 75 views
0

我们怎样才能invoke c# windows service(或)dll从Oracle AFTER INSERT Trigger调用C#Windows服务AFTER INSERT触发器

文件任何建议将高度赞赏

最好的问候,

+0

你有什么试过?请提出具体问题并提供代码示例。这里有一个类似的问题:https://stackoverflow.com/questions/14918695/invoke-windows-service-from-oracle-after-insert-trigger –

回答

1

作为一个规则, windows服务并不是针对特定请求调用的,它应该在后台连续运行。

为了让Oracle DB做些事情,你首先需要在你的表上监控插入的触发器。

然后,这应该叫java存储过程。此存储过程然后可以在消息总线上发送消息,该消息可以由您的服务接收并处理。

参见:
Sending a JMS Message from Oracle Database on DML Event

Oracle: Java stored procedure sending JMS Message

https://docs.oracle.com/cd/B19306_01/server.102/b14257/jm_point.htm

另一种方法是获取Java通过将Oracle存储过程调用外部程序

+0

我需要当我的oracle数据库表被更改,然后触发器应该从c#窗口服务 – Deepak

+0

这不是触发器的工作原理。触发器在数据库表发生某些事情时触发,它只存在于数据库中。使用我上面建议的程序让你的Windows服务做你需要做的事情,这可能是发送消息/事件到另一个程序。 –

+0

如何在oracle触发时调用c#窗口服务当我的数据库表插入一行或更新 – Deepak

0

我已经解决了这个问题触发使用utl_http调用WebApi服务。这样的“服务”可以坐等待请求和触发轻触。以下是我的触发器示例:

declare 
    content varchar2(4000); 
    req utl_http.req; 
    res utl_http.resp; 
    url varchar2(4000) := 'http://server.com/api/Function'; 
begin 

    content := '{ "Message": "Hello" }'; 
    req := utl_http.begin_request(url, 'POST',' HTTP/1.1'); 
    utl_http.set_header(req, 'user-agent', 'mozilla/4.0'); 
    utl_http.set_header(req, 'content-type', 'application/json'); 
    utl_http.set_header(req, 'Content-Length', length(content)); 

    utl_http.write_text(req, content); 
    res := utl_http.get_response(req); 
    if res.status_code <> 200 then 
    dbms_output.put_line(res.reason_phrase); 
    end if; 
    utl_http.end_response(res); 
end; 

您可以将所需的任何逻辑放入WebApi端点。如果你真的想要一个windows服务,你可以让触发器写入类似RabbitMQ的东西,并让服务使用交换队列。

+0

好的,但如何创建一个调用c#窗口servie的oracle触发器?当我的数据库记录发生变化时自动触发邮件或在表中插入新行...................... – Deepak

+0

上述代码将在更改或插入时触发会发生(只要它被创建为触发器),并且它会向列出的URL发送一条消息 - 该服务可以轻松发送邮件,只需要用您想发送的内容填充内容,并启用端点即可。 –

+0

@ Dominic ......上面的代码给你提供了如何在oracle触发器和服务中使用的代码 – Deepak