DataSetProvider的poAllowCommandText设置为True了以后,想在服务器段监视客户端提交的SQL,怎么做,谢谢

解决方案 »

  1.   

    查了一个相关Provider类,似乎没找到什么地方可以进行监视的入口,不过另外有一种方法就是将TDataSetProvider进行改写在DoBeforeExecute处截掉,须注意的是,如果将这个暴露出一个监视接口,那么参数CommandText就需要使用const声明,除非有必要内部进行调整。
      

  2.   

    另外还有一个方法就是在TDataSet上作文章。
    protected
        { IProviderSupport }
        procedure PSEndTransaction(Commit: Boolean); virtual;
        procedure PSExecute; virtual;
        function PSExecuteStatement(const ASQL: string; AParams: TParams;
          ResultSet: Pointer = nil): Integer; virtual;
        procedure PSGetAttributes(List: TList); virtual;
        function PSGetDefaultOrder: TIndexDef; virtual;
        function PSGetKeyFields: string; virtual;
        function PSGetParams: TParams; virtual;
        function PSGetQuoteChar: string; virtual;
        function PSGetTableName: string; virtual;
        function PSGetIndexDefs(IndexTypes: TIndexOptions): TIndexDefs; virtual;
        function PSGetUpdateException(E: Exception; Prev: EUpdateError): EUpdateError; virtual;
        function PSInTransaction: Boolean; virtual;
        function PSIsSQLBased: Boolean; virtual;
        function PSIsSQLSupported: Boolean; virtual;
        procedure PSReset; virtual;
        procedure PSSetParams(AParams: TParams); virtual;
        procedure PSSetCommandText(const CommandText: string); virtual;
        procedure PSStartTransaction; virtual;
        function PSUpdateRecord(UpdateKind: TUpdateKind; Delta: TDataSet): Boolean; virtual;
    这是TDataSet的接口部分,而这里面主要关心的是PSSetCommandText和PSExecute,这样子就看你当前所使用的DataSet类这两个过程的实体是否还有外部接口,可以用于监视。当然也要以自己继续TDataSet去做出处理。