gpt4 book ai didi

sql-server - 如何将 SQL BACKUP 命令的结果输出获取到 Delphi 程序中?

转载 作者:行者123 更新时间:2023-12-03 15:11:32 24 4
gpt4 key购买 nike

从 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”组件。

最佳答案

这是一个例子。我已经用 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 命令更正它。

关于sql-server - 如何将 SQL BACKUP 命令的结果输出获取到 Delphi 程序中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11908741/

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