J
jierxrh
Unregistered / Unconfirmed
GUEST, unregistred user!
数据库某表更新后怎样才能马上通知应用程序?
我的需求是:当A表有新数据后,马上计算,然后产生一个消息(就是字符串),发送给a程序,由a程序去处理这个消息(字符串)。如果用a程序循环不断去提那个消息,太浪费系统资源,而且数据量很大,所以暂时不采用这种方式。
另外那个消息可能是不断产生,所以是不断发送给a程序哦!
已经做过测试有:
1、在触发器中写上exec xp_cmdshell 'b.exe' 来触发b程序,在b程序中用SENDMESSAGE给a程序,a程序接收不到(b程序是执行了,但没界面,来回折腾不知能不能挺住)。
2、扩展存储过程,不知道是写得不对还是怎样,在触发器里调用后,也发送不了消息。
3、COM组件,跟扩展存储过程一个样,SendMessage没有,主要是FindWindow不到那个a程序
function TMyXrhCom.SendMsg(const aCaption: WideString): WideString;
var
hwq:HWND;
begin
Result := '';
hwq := FindWindow(nil, Pchar(aCaption)); //就是这里找不到,不知COM里用什么
if hwq <> 0 then
begin
PostMessage(hwq,WM_CLOSE,0,0);
Result := aCaption;
end;
end;
那位大哥,救救小妹啊!!!!!!![][][][][][]
要我这个COM组件调试的留下QQ,或加我QQ :58413709
一、建一个COM
unit ComFrm;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
ComObj, ActiveX, MYCOM_TLB, StdVcl;
type
TMyXrhCom = class(TAutoObject, IMyXrhCom)
protected
function SendMsg(const aCaption: WideString): WideString; safecall;
{ Protected declarations }
end;
implementation
uses ComServ, Windows, Messages;
function TMyXrhCom.SendMsg(const aCaption: WideString): WideString;
var
hwq:HWND;
begin
Result := '';
hwq := FindWindow(nil, Pchar(aCaption));
FWindowHandle := AllocateHWnd(WndProc);
if hwq <> 0 then
begin
PostMessage(hwq,WM_CLOSE,0,0);//关闭打开的计算器
Result := aCaption;
end;
end;
initialization
TAutoObjectFactory.Create(ComServer, TMyXrhCom, Class_MyXrhCom,
ciMultiInstance, tmApartment);
end.
二、先用 Regsvr32命令注册:
如:Regsvr32 D:/古格软件(家具版)/Client/MYCOM.dll
三、再在查询分析器里SQL执行:
--工程名称: MyCOM
--类名: MyXrhCom
declare @err int,@src varchar(255),@desc varchar(255), @re varchar(255)
declare @obj int
--创建调用实例
exec @err=sp_OACreate 'MyCOM.MyXrhCom', @obj out
if @err<>0 goto lberr --如果创建失败,则进行错误处理
--调用DLL中的函数
exec @err=sp_OAMethod @obj,'SendMsg',@re out,'计算器'
if @err<>0 goto lberr --如果调用错误,则进行错误处理
print '返回的结果是:' + @re -- str(@re)
--完成后释放
exec sp_OADestroy @obj
return
lberr:
exec sp_oageterrorinfo 0,@src out,@desc out
select cast(@err as varbinary(4)) as 错误号, @src as 错误源,@desc as 错误描述
我的需求是:当A表有新数据后,马上计算,然后产生一个消息(就是字符串),发送给a程序,由a程序去处理这个消息(字符串)。如果用a程序循环不断去提那个消息,太浪费系统资源,而且数据量很大,所以暂时不采用这种方式。
另外那个消息可能是不断产生,所以是不断发送给a程序哦!
已经做过测试有:
1、在触发器中写上exec xp_cmdshell 'b.exe' 来触发b程序,在b程序中用SENDMESSAGE给a程序,a程序接收不到(b程序是执行了,但没界面,来回折腾不知能不能挺住)。
2、扩展存储过程,不知道是写得不对还是怎样,在触发器里调用后,也发送不了消息。
3、COM组件,跟扩展存储过程一个样,SendMessage没有,主要是FindWindow不到那个a程序
function TMyXrhCom.SendMsg(const aCaption: WideString): WideString;
var
hwq:HWND;
begin
Result := '';
hwq := FindWindow(nil, Pchar(aCaption)); //就是这里找不到,不知COM里用什么
if hwq <> 0 then
begin
PostMessage(hwq,WM_CLOSE,0,0);
Result := aCaption;
end;
end;
那位大哥,救救小妹啊!!!!!!![][][][][][]
要我这个COM组件调试的留下QQ,或加我QQ :58413709
一、建一个COM
unit ComFrm;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
ComObj, ActiveX, MYCOM_TLB, StdVcl;
type
TMyXrhCom = class(TAutoObject, IMyXrhCom)
protected
function SendMsg(const aCaption: WideString): WideString; safecall;
{ Protected declarations }
end;
implementation
uses ComServ, Windows, Messages;
function TMyXrhCom.SendMsg(const aCaption: WideString): WideString;
var
hwq:HWND;
begin
Result := '';
hwq := FindWindow(nil, Pchar(aCaption));
FWindowHandle := AllocateHWnd(WndProc);
if hwq <> 0 then
begin
PostMessage(hwq,WM_CLOSE,0,0);//关闭打开的计算器
Result := aCaption;
end;
end;
initialization
TAutoObjectFactory.Create(ComServer, TMyXrhCom, Class_MyXrhCom,
ciMultiInstance, tmApartment);
end.
二、先用 Regsvr32命令注册:
如:Regsvr32 D:/古格软件(家具版)/Client/MYCOM.dll
三、再在查询分析器里SQL执行:
--工程名称: MyCOM
--类名: MyXrhCom
declare @err int,@src varchar(255),@desc varchar(255), @re varchar(255)
declare @obj int
--创建调用实例
exec @err=sp_OACreate 'MyCOM.MyXrhCom', @obj out
if @err<>0 goto lberr --如果创建失败,则进行错误处理
--调用DLL中的函数
exec @err=sp_OAMethod @obj,'SendMsg',@re out,'计算器'
if @err<>0 goto lberr --如果调用错误,则进行错误处理
print '返回的结果是:' + @re -- str(@re)
--完成后释放
exec sp_OADestroy @obj
return
lberr:
exec sp_oageterrorinfo 0,@src out,@desc out
select cast(@err as varbinary(4)) as 错误号, @src as 错误源,@desc as 错误描述