首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Delphi代码中获取存储过程的SQL内容?

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

Stack Overflow用户
提问于 2016-02-14 20:11:36
回答 2查看 2.7K关注 0票数 1

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

我这辈子从没用过德尔福。我是一个C,C++,C#程序员。

我能够看到存储过程的输出(结果),但我需要看到存储过程的内容(我指的是SQL语句)。我查看了Server端,但没有发现任何东西。

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

代码语言:javascript
运行
复制
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‘在这里声明:

代码语言:javascript
运行
复制
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‘的文本是:

代码语言:javascript
运行
复制
  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代码?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-15 06:38:10

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

代码语言:javascript
运行
复制
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;

用法:

代码语言:javascript
运行
复制
S := MSSQL_GetModuleText(ADOConnectionSN, 'dbo.spGetSN');
票数 3
EN

Stack Overflow用户

发布于 2016-02-14 21:43:50

以下内容应该给你一个如何做它的想法:

  • 将名为TAdoQuery的AdoQuerySP添加到表单中,并将其连接设置为当前使用的任何AdoConnection组件。
  • 向表单中添加一个TMemo。
  • 向表单中添加一个TButton,并设置其OnClick处理程序以执行下面的代码(在将checklibuse更改为SP名称后)。

代码:

代码语言:javascript
运行
复制
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;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35397412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档