首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Delphi中使用ADOConnection查看'print‘语句的输出

在Delphi中使用ADOConnection查看'print‘语句的输出
EN

Stack Overflow用户
提问于 2008-10-31 18:42:53
回答 4查看 6.5K关注 0票数 10

我的一些MS SQL存储过程使用'print‘命令生成消息。在我的Delphi2007应用程序中,它使用TADOConnection连接到MS,我如何查看这些“打印”命令的输出?

关键要求: 1)我不能多次运行查询;它可能正在更新内容。2)即使返回数据集,我也需要看到‘打印’结果。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-11-01 00:27:54

这是一个很有趣的问题。

来自ADOConnection的OnInfoMessage事件可以工作,但细节中有魔鬼!

要点:

使用CursorLocation = clUseServer而不是默认的clUseClient。

在你的ADOStoredProc中使用Open而不是ExecProc。

使用当前版本的NextRecordset获取以下内容,但一定要检查是否有打开的版本。

在存储过程中使用SET NOCOUNT = ON。

SQL端:您的存储过程

代码语言:javascript
复制
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[FG_TEST]') AND type in (N'P', N'PC'))
  DROP PROCEDURE [dbo].[FG_TEST]
GO
-- =============================================
-- Author:      François
-- Description: test multi ADO with info
-- =============================================
CREATE PROCEDURE FG_TEST
AS
BEGIN
    -- SET NOCOUNT ON absolutely NEEDED
    SET NOCOUNT ON;

    PRINT '*** start ***'

    SELECT 'one' as Set1Field1

    PRINT '*** done once ***'

    SELECT 'two' as Set2Field2

    PRINT '*** done again ***'

    SELECT 'three' as Set3Field3

    PRINT '***finish ***'
END
GO

Delphi端:

创建一个新的VCL窗体应用程序。

在表单中放置一个备注和一个按钮。

复制以下文本,更改目录和数据源,然后将其粘贴到表单上

代码语言:javascript
复制
object ADOConnection1: TADOConnection
  ConnectionString = 
    'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security In' +
    'fo=False;Initial Catalog=xxxYOURxxxDBxxx;Data Source=xxxYOURxxxSERVERxxx'
  CursorLocation = clUseServer
  LoginPrompt = False
  Provider = 'SQLOLEDB.1'
  OnInfoMessage = ADOConnection1InfoMessage
  Left = 24
  Top = 216
end
object ADOStoredProc1: TADOStoredProc
  Connection = ADOConnection1
  CursorLocation = clUseServer
  ProcedureName = 'FG_TEST;1'
  Parameters = <>
  Left = 24
  Top = 264
end

在ADOConnection put的OnInfoMessage中

代码语言:javascript
复制
Memo1.Lines.Add(Error.Description);

对于ButtonClick,粘贴以下代码

代码语言:javascript
复制
procedure TForm1.Button1Click(Sender: TObject);
const
  adStateOpen = $00000001; // or defined in ADOInt
var
  I: Integer;
  ARecordSet: _Recordset;
begin
  Memo1.Lines.Add('==========================');

  ADOStoredProc1.Open; // not ExecProc !!!!!

  ARecordSet := ADOStoredProc1.Recordset;
  while Assigned(ARecordSet) do
  begin
    // do whatever with current RecordSet
    while not ADOStoredProc1.Eof do
    begin
      Memo1.Lines.Add(ADOStoredProc1.Fields[0].FieldName + ': ' + ADOStoredProc1.Fields[0].Value);
      ADOStoredProc1.Next;
    end;
    // switch to subsequent RecordSet if any
    ARecordSet := ADOStoredProc1.NextRecordset(I);
    if Assigned(ARecordSet) and ((ARecordSet.State and adStateOpen) <> 0) then
      ADOStoredProc1.Recordset := ARecordSet
    else
      Break;
  end;

  ADOStoredProc1.Close;
end;
票数 9
EN

Stack Overflow用户

发布于 2008-10-31 18:58:08

在.Net的connection类中,有一个名为InfoMessage的事件。在此事件的处理程序中,您可以从事件参数中检索InfoMessage (打印语句)。

我相信Delphi有一个类似的活动,叫做"OnInfoMessage“,它会对你有所帮助。

票数 3
EN

Stack Overflow用户

发布于 2008-10-31 18:48:28

我认为这是不可能的。您可以使用临时表转储print语句,并将其与结果一起返回。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/254486

复制
相关文章

相似问题

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