Delphi5需要扩展ADODB_TLB接口
这个问题很可能会让一些经验丰富的开发者回忆起用古代设备挖掘的散兵坑里的炮火 我们需要对一些老化的web代码进行一些低级数据库处理。我们已经编写了一个COM库来进行其他处理,比如加密和用户身份验证,我们已经确定最好的方法是创建一个COM接口,扩展现有的ADODB_TLB接口,并添加一些处理 当所有的话都说了,做了,它将如何被使用,是为了替换一些看起来像这样的现有呼叫:Delphi5需要扩展ADODB_TLB接口,delphi,com,ado,Delphi,Com,Ado,这个问题很可能会让一些经验丰富的开发者回忆起用古代设备挖掘的散兵坑里的炮火 我们需要对一些老化的web代码进行一些低级数据库处理。我们已经编写了一个COM库来进行其他处理,比如加密和用户身份验证,我们已经确定最好的方法是创建一个COM接口,扩展现有的ADODB_TLB接口,并添加一些处理 当所有的话都说了,做了,它将如何被使用,是为了替换一些看起来像这样的现有呼叫: Set CMD = Server.CreateObject("ADODB.Command") CMD.Active
Set CMD = Server.CreateObject("ADODB.Command")
CMD.ActiveConnection = DB
CMD.CommandType = adCmdStoredProc
CMD.CommandText = "Country_Code_Get"
CMD.Parameters.Append CMD.CreateParameter(, adInteger, adParamInput, 4, NULL)
Set RS = CMD.Execute()
Set CMD = Server.CreateObject("MyADODB.Command")
CMD.ActiveConnection = DB
CMD.CommandType = adCmdStoredProc
CMD.CommandText = "Country_Code_Get"
CMD.SpecialHandling = "Extra Stuff"
CMD.Parameters.Append CMD.CreateParameter(, adInteger, adParamInput, 4, NULL)
Set RS = CMD.Execute()
新代码看起来更像这样:
Set CMD = Server.CreateObject("ADODB.Command")
CMD.ActiveConnection = DB
CMD.CommandType = adCmdStoredProc
CMD.CommandText = "Country_Code_Get"
CMD.Parameters.Append CMD.CreateParameter(, adInteger, adParamInput, 4, NULL)
Set RS = CMD.Execute()
Set CMD = Server.CreateObject("MyADODB.Command")
CMD.ActiveConnection = DB
CMD.CommandType = adCmdStoredProc
CMD.CommandText = "Country_Code_Get"
CMD.SpecialHandling = "Extra Stuff"
CMD.Parameters.Append CMD.CreateParameter(, adInteger, adParamInput, 4, NULL)
Set RS = CMD.Execute()
我们的目标是扩展现有的ADODB库,使我们只需对大型代码库进行最少的更改即可实现额外的处理
有没有一种方法可以扩展现有的_命令接口,只添加我们的新参数(当然,还可以覆盖必要的Execute函数来适当地处理新参数),而不需要有效地复制整个_命令接口?如果我猜对了,您问题中的代码片段可能会在命令对象上使用后期绑定。这意味着它可能会通过接口的方法。从
comObject.pas
单元查看TAutoObject
,它实现IDispatch
,并映射到Delphi类型系统中的类型信息
因此,在本例中,扩展ADO时,我不会使用ADO_TLB或类型库GUI(可能除了File>New>Other…和ActiveX选项卡中的“Automation Object”)并集中精力创建替代IDispatch实现,通过ADO.Command实例的活动实例的IDispatch指针修补任何未覆盖的调用。(还有更多内容)只要不更改接口部分,修改AdoDB.Pas的实现部分就非常简单。我这样做是为了解决一些奇怪的问题。我不知道有什么简单的方法可以修改_命令接口,如果你指的是COM接口,但是你肯定可以改变它从AdoDB.Pas调用的方式。这是否也包括向类添加新属性?如果你需要设计时支持,不要向AdoDB.Pas接口中声明的类添加新属性,因为类的属性出现在接口中(在最近的Delphi版本中,您可以使用“类助手”添加属性getter和setter,但D5早了20年)。但是,没有什么可以阻止您创建一个单元,该单元在AdoDB中声明类的后代,并添加您想要的任何属性——当然,您需要查看使用它们的方法在AdoDB中是否可以重写。使用不同的名称调用
CreateObject()
将实例化不同的COM对象。因此,您需要做的就是使用自己的CLSID和TLB实现自己的COM类,并使其默认的CoClass接口派生自ADO的命令
接口,以便继承ADO现有的方法和属性。然后,您可以根据需要向自定义类添加任何内容。在内部,自定义类可以实例化ADO的real命令
对象,并根据需要委托给它。实际上,您并不是在扩展ADO本身,而是在其周围放置了一个包装器。不需要更改AdoDB单位。@MartinA我认为这对我们不起作用,因为当工作站发出Server.CreateObject(“AdoDB.Command”)调用时,它正在AdoDB库中创建一个Command类的实例,该库安装在Web服务器上,我不会覆盖它(这是针对网站的,不是部署在机器上的应用。)(对不起,雷米,这是回复MartynA的评论,不是你的。)