gpt4 book ai didi

sql-server - 在 Delphi 中使用 ADOConnection 查看 'print' 语句的输出

转载 作者:行者123 更新时间:2023-12-03 14:41:45 26 4
gpt4 key购买 nike

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

关键要求:1)我不能多次运行查询;它可能正在更新一些东西。2)即使返回数据集,我也需要查看“打印”结果。

最佳答案

这很有趣......
ADOConnection 中的 OnInfoMessage 事件有效,但问题在于细节!

要点:
使用 CursorLocation = clUseServer 而不是默认的 clUseClient。
在 ADOStoredProc 中使用 Open 而不是 ExecProc。
使用当前记录集中的 NextRecordset 来获取以下内容,但请务必检查您是否已打开一个记录集。
在存储过程中使用 SET NOCOUNT = ON。

SQL 端:您的存储过程

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

德尔福方面:
创建一个新的 VCL 表单应用程序。
在表单中添加备忘录和按钮。

复制以下文本,更改目录和数据源并将其粘贴到您的表单

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 的 OnInfoMessage 中放置

Memo1.Lines.Add(Error.Description);

对于 ButtonClick,粘贴此代码

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;

关于sql-server - 在 Delphi 中使用 ADOConnection 查看 'print' 语句的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/254486/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com