如何将SQL BACKUP命令的结果输出到Delphi程序中?

War*_* P 5 sql-server delphi ado

从SQL Server Management Studio以交互方式运行SQL命令的用户可以看到的sql命令输出与从执行ADO命令或ADO查询对象返回的输出不同.

USE [DBNAME] 
BACKUP DATABASE [DBNAME] TO 
 DISK = 'C:\SqlBackup\Backup.mdf'
Run Code Online (Sandbox Code Playgroud)

成功完成输出如下:

Processed 465200 pages for database 'DBNAME', file 'filename' on file 2.
Processed 2 pages for database 'DBNAME', file 'filename_log' on file 2.
BACKUP DATABASE successfully processed 465202 pages in 90.595 seconds (40.116 MB/sec).
Run Code Online (Sandbox Code Playgroud)

当我使用如上所述的CommandText或SQL集执行TADOCommand或TADOQuery时,我没有得到任何这样的输出.如何从执行SQL命令中读取此"辅助输出"?我希望通过一些原始的ADO操作,我可能能够执行命令并获取上面的信息,以获得成功,以及执行Sql备份时的任何错误.

更新:下面的答案对我来说比使用普通Delphi TADOCommand和TADOConnection类的天真尝试更好,这种尝试无法正常工作:

  • 创建TADOCommand和TADOConnection.
  • 执行命令.
  • 获取信息消息.

我在自己的编码尝试中遇到的问题是,我的第一个命令是"use dbname",我在代码中遍历的唯一记录集是"use dbname"命令的结果,而不是我执行的第二个命令.下面接受的答案遍历从执行ADO命令返回的所有记录集,因此它工作得更好.由于我在后台线程中做了所有这些,我实际上认为最好还是创建原始的Com Objects,并避免在我的线程中出现任何VCL纠缠.如果有人感兴趣,下面的代码可能是一个很好的组件,让我知道,我可能会创建一个开源的"SQL备份为Delphi"组件.

val*_*lex 5

这是一个例子.我用D7和MSSQL2000测试过它.它将来自服务器的所有消息添加到Memo1:

29 percent backed up.
58 percent backed up.
82 percent backed up.
98 percent backed up.
Processed 408 pages for database 'NorthWind', file 'Northwind' on file 1.
100 percent backed up.
Processed 1 pages for database 'NorthWind', file 'Northwind_log' on file 1.
BACKUP DATABASE successfully processed 409 pages in 0.124 seconds (26.962 MB/sec).
Run Code Online (Sandbox Code Playgroud)

此外,如果需要很长时间考虑实现不在主线程中的WHILE循环.

uses AdoInt,ComObj;
.....

procedure TForm1.Button1Click(Sender: TObject);
var cmd  : _Command;
    Conn : _Connection;
    RA   : OleVariant;
    rs   :_RecordSet;
    n    : Integer;
begin
  Memo1.Clear;

  Conn := CreateComObject(CLASS_Connection) as _Connection;
  Conn.ConnectionString := 'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=NorthWind;Data Source=SQL_Server';
  Conn.Open(Conn.ConnectionString,'','',Integer(adConnectUnspecified));

  cmd := CreateComObject(CLASS_Command) as _Command;
  cmd.CommandType := adCmdText;
  cmd.Set_ActiveConnection(Conn);
  cmd.CommandText := 'BACKUP DATABASE [NorthWind] TO  DISK = N''c:\sql_backup\NorthWind'' WITH  INIT ,  NOUNLOAD ,  NAME = N''NortWind backup'',  NOSKIP ,  STATS = 10,  NOFORMAT;';
  rs:=cmd.Execute(RA,0,Integer(adCmdText));

  while (rs<>nil) do
  begin
   for n:=0 to(Conn.Errors.Count-1)do begin
    Memo1.Lines.Add(Conn.Errors.Item[n].Description);
   end;
   rs:=rs.NextRecordset(RA);
  end;

  cmd.Set_ActiveConnection(nil);
  Conn.Close;
  cmd  := nil;
  Conn := nil;
end;
Run Code Online (Sandbox Code Playgroud)

我找到了存储过程的这个线程(俄语)并为BACKUP命令更正了它.

  • 我已经在Delphi 2007和XE2中使用MS SQL Server 2008 R2和SQL Server 2012测试了上述内容,它也在那里工作.我把它移到后台线程,因为那总是我的计划.如果有人想要上面的开源组件版本(线程),请告诉我(upvote占用的空间少于评论). (4认同)