5

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

USE [DBNAME] 
BACKUP DATABASE [DBNAME] TO 
 DISK = 'C:\SqlBackup\Backup.mdf'

成功完成输出是这样的:

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).

当我使用上面设置的 CommandText 或 SQL 执行 TADOCommand 或 TADOQuery 时,我没有得到任何这样的输出。如何从 SQL 命令的执行中读取这个“辅助输出”?我希望也许通过一些原始的 ADO 操作,我可能能够执行命令并取回上面的信息,以取得成功,以及执行 Sql 备份时的任何错误。

更新:下面的答案对我来说比我天真的尝试更好,它没有工作,使用普通的 Delphi TADOCommand 和 TADOConnection 类:

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

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

4

1 回答 1

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).

此外,如果需要很长时间,请考虑不在主线程中实现 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;

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

于 2012-08-13T09:24:55.047 回答