如何在 Delphi 代码中获取存储过程的 SQL 内容



我正在使用Delphi 7 IDE调试Delphi代码,代码不是我的。我的目标是了解这段代码是如何工作的。这将帮助我编写与此代码接口的应用程序。

我一生中从未使用过德尔福。我是一名 C、C++、C# 程序员。

我能够看到存储过程

的输出(结果(,但我需要看到存储过程的内容(我的意思是 SQL 语句(。我在SQL Server端查找,但没有找到任何东西。

存储过程在此函数中调用:

function TDBDM.getID( prKeyName : string ) : integer;
begin
  try
    spGetSN.Parameters.ParamValues['@prKeyname'] := prKeyName;
    spGetSN.open;
    result := spGetSN.Fields[0].AsInteger;
  finally
    spGetSN.close;
  end;
end;

存储过程"spGetSN"在这里声明:

unit dmDB;
interface
uses
   SysUtils, Classes, Forms, ADODB, DB, TypInfo, Dialogs, StdCtrls,
   Controls,Registry, Windows;
type
   eConnectionType = (ctSN);
TDBDM = class(TDataModule)
    ADOConnectionSN: TADOConnection;
    spGetSN: TADOStoredProc;
    ADOQueryGetPartNoFromRMA: TADOQuery;
    ADOQueryGetPartNoFromOrder: TADOQuery;
    procedure ADOConnectionSNBeforeConnect(Sender: TObject);
    procedure DataModuleCreate(Sender: TObject);
 private
    { Private declarations }
    function GetConnection( prConnectionType : eConnectionType ) :   
    TADOConnection;
 public
    { Public declarations }
    function getID( prKeyName : string ) : integer;
    function getSN( prKeyName : string ) : string;
    function getCommaValues( prSelect : string; prConnection :  
        eConnectionType = ctSN ) : string;
    property pConnection[prType : eConnectionType] : TADOConnection read 
       GetConnection; default;
 end;
 var
    DBDM: TDBDM;
 implementation
 uses dmRegistryClasses;
 {$R *.dfm}

在 IDE 中定义的对象 TADOSTOREDPROC 'spGetSN' 的文本是:

  object spGetSN: TADOStoredProc
    Connection = ADOConnectionSN
    ProcedureName = 'spGetSN;1'
    Parameters = <
      item
        Name = '@RETURN_VALUE'
        DataType = ftInteger
        Direction = pdReturnValue
        Precision = 10
        Value = Null
      end
      item
        Name = '@prKeyname'
        Attributes = [paNullable]
        DataType = ftWideString
        Size = 30
        Value = Null
      end>
    Left = 268
    Top = 80
  end

如何在 Delphi 调试器中打印或观看此存储过程的 SQL 代码?谢谢

下面应该会告诉你如何做到这一点:

  • 将一个名为 AdoQuerySP 的 TAdoQuery 添加到窗体中,并将其连接设置为当前使用的任何 AdoConnection 组件。

  • 将 TMemo 添加到窗体中。

  • 将 TButton 添加到窗体并设置其 OnClick 处理程序以执行下面的代码(在将checklibuse更改为 SP 的名称后(。

法典:

procedure TForm1.GetSPDefinition;
var
  S : String;
begin
  S := '';
  AdoQuerySP.Sql.Text := 'exec sp_helptext checklibuse';  //  sp_helptext
  //  is a Sql Server system stored proc to retrieve the definition of 
  // a stored proc.  The definition is returned as a series of rows which need to be 
  //  concatenated together as in the `while ...` loop below.
  AdoQuerySP.Open;
  while not AdoQuerySP.Eof do begin
    if S <> '' then
      S := #13#10 + S;
    S := S + AdoQuerySP.FieldByName('Text').AsString;
    AdoQuerySP.Next;
  end;
  //  The retrieved definition is typically preceded by a number of blank lines
  //  which the call to Trim() remove.
  Memo1.Lines.Text := Trim(S);
end;

您可以查询sys.sql_modules表,例如:

function MSSQL_GetModuleText(conn: TADOConnection; const ModuleName: WideString): WideString;
var
  SQL: WideString;
  rs: Variant;
begin
  SQL := Format('SELECT [definition] FROM sys.sql_modules WHERE [object_id]=OBJECT_ID(N''%s'')', [ModuleName]);
  rs := conn.Execute(SQL);
  Result := VarToWideStr(rs.Fields[0]); 
end;

用法:

S := MSSQL_GetModuleText(ADOConnectionSN, 'dbo.spGetSN');

最新更新