从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类,下面的答案对我来说比使用朴素的尝试更有效,这种尝试无效:
我在自己的编码尝试中遇到的问题是,我的第一个命令是“use dbname”,我在代码中遍历的唯一记录集是“use dbname”命令的结果,而不是我的第二个命令执行。下面接受的答案遍历从执行ADO命令返回的所有记录集,因此它工作得更好。由于我在后台线程中做了所有这些,我实际上认为最好还是创建原始的Com Objects,并避免在我的线程中出现任何VCL纠缠。如果有人感兴趣,下面的代码可能是一个很好的组件,让我知道,我可能会创建一个开源的“Delphi的SQL备份”组件。
答案 0 :(得分: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;
我找到了存储过程的this thread (Russian)并将其更正为BACKUP命令。