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」コマンドの結果であり、実行していた2番目のコマンドではないことです。以下の受け入れられた答えは、ADOコマンドの実行から戻ってきたすべてのレコードセットをトラバースするため、はるかにうまく機能します。私はこれらすべてをバックグラウンドスレッドで行っているので、とにかく生のComオブジェクトを作成し、スレッド内のVCLエンタングルメントを回避する方が実際には良いと思います。以下のコードは、誰かが興味を持っている場合は素晴らしいコンポーネントになる可能性があります。私に知らせてください。オープンソースの「SQLBackupforDelphi」コンポーネントを作成する可能性があります。

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 に答える