【问题标题】:How to get the SQL content of the stored procedure in Delphi code?Delphi代码中如何获取存储过程的SQL内容?
【发布时间】:2016-05-25 15:46:49
【问题描述】:

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

我一生中从未使用过 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 代码?谢谢

【问题讨论】:

  • 您不能轻易地从 Delphi 应用程序中获取存储过程的源代码。从 Sql Server Management Studio 中查看 SP 要容易得多:您无权访问吗?

标签: sql-server delphi stored-procedures


【解决方案1】:

以下内容应该让您知道如何做到这一点:

  • 将一个名为 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;

【讨论】:

  • 酷它工作。非常感谢您。但是为什么我在 MS SQL SERVER 中找不到这个存储过程?
  • 我使用的是 MS-SQL server 2014,我在资源管理器窗口中进行了搜索。数据库->MyDatabase->可编程性->存储过程。我也试过这个查询:使用 [MyDataBase] go exec sp_helptext MyStoredProcedure go。我在 MS SQL SERVER 中找不到这个存储过程。我们可以在 Delphi 代码中定义存储过程吗?
  • 检查您的连接选项。在我看来,当您通过 SSMS 连接到本地 Expess 实例时,应用程序正在连接到真实服务器。
  • 由于您没有创建 SP,我能想到您在 SSMS 中看不到 SP 的唯一合理原因可能是您从具有足够权限的帐户连接到服务器,但请尝试使用谷歌搜索,因为这似乎是有多种原因的常见问题。 Fwiw,我可以在自己的服务器上看到 SP。您当然可以在 Delphi 代码中创建一个 SP - 创建一个 Sql 脚本来执行此操作,将其文本分配给 AdoQuery,然后在其上调用 .ExecSql。
【解决方案2】:

您可以查询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');

【讨论】:

  • 是的。谢谢。我必须在 use 语句中添加 Variants 单元。
猜你喜欢
  • 2010-10-07
  • 2013-04-06
  • 2014-04-21
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
相关资源
最近更新 更多