DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: lorangeve
今日帖子: 41
在线用户: 23
导航: 论坛 -> 数据库专区 斑竹:liumazi,waterstone  
作者:
男 luckyrandom (luckyrandom) ★☆☆☆☆ -
普通会员
2021/4/21 9:03:59
标题:
关于取SQL Server Print消息 浏览:2367
加入我的收藏
楼主: ADOConnection.CursorLocation=clUseServer
ADOQuery.CursorLocation=clUseServer

执行:
print 'aaa';
print 'bbb';
print 'ccc';

在 InfoMessage 里只能取到第一个print的值,即:
aaa

第2个及后面的 print 内容取不到。。。要如何取回3个消息?
aaa
bbb
ccc


procedure TForm9.ConnInfoMessage(Connection: TADOConnection; const Error: Error;  var EventStatus: TEventStatus);
var I:Integer;
begin
  Memo1.Lines.Add('Count: '+IntToStr(Connection.Errors.Count));
  for I:=0 to Connection.Errors.Count-1 do
    Memo1.Lines.Add(Connection.Errors[I].Description);
end;

Error只有一个值,Connection.Errors.Count 也等于 1
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier  缘在上海
作者:
男 dlfsystem (dlfsystem) ★☆☆☆☆ -
盒子活跃会员
2021/4/21 10:17:23
1楼: go
----------------------------------------------
-
作者:
男 luckyrandom (luckyrandom) ★☆☆☆☆ -
普通会员
2021/4/21 17:20:04
2楼: select name into #t
  from sys.databases;

(10 行受影响)

这样的消息也没找到办法获取到。。,似乎C#能抓到
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier  缘在上海
作者:
男 luckyrandom (luckyrandom) ★☆☆☆☆ -
普通会员
2021/4/22 11:29:49
3楼: 看C#示例是用ADO.net,我习惯是在用 OLE DB,现在就折腾着如何获取消息
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier  缘在上海
作者:
男 luckyrandom (luckyrandom) ★☆☆☆☆ -
普通会员
2021/4/23 17:31:17
4楼: 顶下。。期待大神们指导
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier  缘在上海
作者:
男 luckyrandom (luckyrandom) ★☆☆☆☆ -
普通会员
2021/4/26 9:13:09
5楼: 再顶下..^_^
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier  缘在上海
作者:
男 luckyrandom (luckyrandom) ★☆☆☆☆ -
普通会员
2021/4/28 10:51:39
6楼: 安静地期待指导
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier  缘在上海
作者:
男 doorkey (DoorKey) ★☆☆☆☆ -
盒子活跃会员
2021/4/28 13:09:32
7楼: d里的ADO估计不行
----------------------------------------------
QQ: 9717005 我的Blog:http://www.cnblogs.com/anydelphi/
作者:
男 luckyrandom (luckyrandom) ★☆☆☆☆ -
普通会员
2021/4/28 17:22:58
8楼: 想做个带有安全的SQL检测执行工具(比如 update 漏了 where),就是这个消息没法获取到。。其他的倒感觉挺顺手
比如 
select * into #t from sys.databases
select * into #t2 from sys.tables

ADOQuery.RowsAffected 也只有第1个SQL的影响行数,其他消息就无法获取到。。尴尬
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier  缘在上海
作者:
男 luckyrandom (luckyrandom) ★☆☆☆☆ -
普通会员
2021/4/28 22:38:20
9楼: @doorkey 如果ADO不行,其他什么组件可以,也请介绍下
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier  缘在上海
作者:
男 bluestorm8 (bluestorm) ▲▲△△△ -
普通会员
2021/4/29 14:48:31
10楼: 用SDAC可以:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  DBAccess, MSAccess, Data.DB, MemDS, Vcl.StdCtrls, Vcl.ComCtrls;

type
  TForm1 = class(TForm)
    MSConnection1: TMSConnection;
    MSStoredProc1: TMSStoredProc;
    RichEdit1: TRichEdit;
    procedure MSConnection1InfoMessage(Sender: TObject; E: EDAError);
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  MSConnection1.OnInfoMessage := MSConnection1InfoMessage;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  MSStoredProc1.StoredProcName := 'TestProc';
  MSStoredProc1.ExecProc;
end;

procedure TForm1.MSConnection1InfoMessage(Sender: TObject; E: EDAError);
begin
  RichEdit1.Lines.Add(E.Message);
end;

end.

CREATE PROCEDURE [dbo].[TestProc] 
  @ID INTEGER OUTPUT
AS
  PRINT 'aaa';
  PRINT 'bbb';
  PRINT 'ccc'
此帖子包含附件:
PNG 图像
大小:2,327B
----------------------------------------------
-
作者:
男 bluestorm8 (bluestorm) ▲▲△△△ -
普通会员
2021/4/29 16:16:40
11楼: 用FireDAC也可以:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Data.DB, MemDS, Vcl.StdCtrls, Vcl.ComCtrls,
  FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf,
  FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Stan.Async,
  FireDAC.Phys, FireDAC.VCLUI.Wait, FireDAC.Phys.MSSQLDef, FireDAC.Stan.Param,
  FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt, FireDAC.Comp.DataSet,
  FireDAC.Comp.Client, FireDAC.Phys.ODBCBase, FireDAC.Phys.MSSQL;

type
  TForm1 = class(TForm)
    RichEdit1: TRichEdit;
    FDConnection1: TFDConnection;
    FDPhysMSSQLDriverLink1: TFDPhysMSSQLDriverLink;
    FDStoredProc1: TFDStoredProc;
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FDConnection1.ResourceOptions.ServerOutput := True;;
end;

procedure TForm1.FormShow(Sender: TObject);
var
  I: Integer;
begin
  FDStoredProc1.StoredProcName := 'TestProc';
  FDStoredProc1.ExecProc;
  for I := 0 to FDConnection1.ConnectionIntf.Messages.ErrorCount - 1 do
    RichEdit1.Lines.Add(FDConnection1.ConnectionIntf.Messages[i].Message);
end;

end.
----------------------------------------------
-
作者:
男 luckyrandom (luckyrandom) ★☆☆☆☆ -
普通会员
2021/4/30 9:41:22
12楼: 感谢 bluestorm8 大侠出手,SDAC是三方控件,所以试了FireDAC:
  QTmp.SQL.Clear;
  QTmp.SQL.Add('print ''aa''; print ''bb''; print ''cc''; print ''dd'';');
  QTmp.SQL.Add('select top 5 name into #t from sys.tables;');
  QTmp.SQL.Add('select top 8 name into #t2 from sys.tables;');
  QTmp.ExecSQL;
  for I := 0 to Conn.ConnectionIntf.Messages.ErrorCount-1 do
    Memo2.Lines.Add(Conn.ConnectionIntf.Messages.Errors[I].Message);

print 的消息可以取到。。但受影响的行没取到,也没找到什么相关属性可调整
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier  缘在上海
作者:
男 bluestorm8 (bluestorm) ▲▲△△△ -
普通会员
2021/4/30 13:37:19
13楼: 这个恐怕实现不了,只能你自己通过print语句产生:
PRINT '(' + CAST(@@ROWCOUNT AS VARCHAR) + ' 行受影响)'
----------------------------------------------
-
作者:
男 ksrsoft (cb168) ★☆☆☆☆ -
普通会员
2021/4/30 13:46:06
14楼: 单条语句能获取RowsAffected 
多个sql肯定不行
----------------------------------------------
-
作者:
男 bluestorm8 (bluestorm) ▲▲△△△ -
普通会员
2021/4/30 14:55:09
15楼: select语句的RowsAffected取不到。
----------------------------------------------
-
作者:
男 luckyrandom (luckyrandom) ★☆☆☆☆ -
普通会员
2021/5/2 8:53:16
16楼: 期待新套路,我看C#是注册了个事件监控听,能取到每个sql影响的行数消息,理论上,delphi应该也可以。。只是偶没基本功,不知如何折腾
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier  缘在上海
作者:
男 bluestorm8 (bluestorm) ▲▲△△△ -
普通会员
2021/5/2 18:33:45
17楼: 没必要搞得那么复杂,受影响的行数可以通过存储过程的return返回,也可以通过output类型的参数返回,没有必要去钻这种牛角尖。
----------------------------------------------
-
作者:
男 luckyrandom (luckyrandom) ★☆☆☆☆ -
普通会员
2021/5/2 21:03:44
18楼: 感谢 bluestorm8 指导,是想做个有安全检测的SQL执行工具(比如缺少where),所以需要有比较自由的SQL执行方式,非固定SP实现。所在在纠结影响行数消息的获取
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier  缘在上海
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行101.5625毫秒 RSS