Red GateのSQLBackup ProソフトウェアをC#で書かれた社内のバックアップソフトウェアに統合しようとしています。これを行うための自然な方法は、Extended Stored Procedureです。問題はこれまでに見たことのない形式で呼ばれているということです。非定型パラメータを使用してストアドプロシージャを呼び出すにはどうすればよいですか?
master..sqlbackup '-SQL "BACKUP DATABASE pubs TO DISK = [C:\Backups\pubs.sqb]"'
これはSSMS経由で実行するとうまく動作します。私が問題に遭遇するところは、C#(.NET 4とDapper Dot Netを使用)から呼び出すことです。
それは、ストアドプロシージャの名前として全体cmd
文字列を解釈し、エラーがスローされますので、私の最初の試みがうまくいかない「『ストアドプロシージャが見つかりません』」:
var cmd = "master..sqlbackup '-SQL \"BACKUP DATABASE pubs TO DISK = [C:\\Backups\\pubs.sqb]\"'";
connection.Execute(cmd, commandType: CommandType.StoredProcedure, commandTimeout: 0);
私の第二の試みはすぐに戻ります
var cmd = "master..sqlbackup";
var p = new DynamicParameters();
p.Add("", "'-SQL \"BACKUP DATABASE pubs TO DISK = [C:\\Backups\\pubs.sqb]\"'");
connection.Execute(cmd, p, commandType: CommandType.StoredProcedure, commandTimeout: 0);
私の3回目の試みも成功したように見えますが、バックアップが実際にとられていない:及び(C#1に)成功したように見えますが、バックアップが実際に取られない(これはまた、パラメータ化のために吸う)
var cmd = "master..sqlbackup '-SQL \"BACKUP DATABASE pubs TO DISK = [C:\\Backups\\pubs.sqb]\"'";
connection.Execute(cmd, commandTimeout: 0);
私は何が欠けていますか?
UPDATE 1:
私は、ストアドプロシージャが実際にSQLエラーが発生しませんと言うレッドゲートのマニュアルを見落として、それだけで出力テーブルにエラーを返します。スリック。これは、上記の2番目と3番目のテストで何故私が静かに失敗したのかを説明するかもしれません。いくつかの根本的な問題です。 SQLのバックアップに渡さ
ないコマンド:
var cmd = "master..sqlbackup"; var p = new DynamicParameters(); p.Add("", "'-SQL \"BACKUP DATABASE pubs TO DISK = [C:\\Backups\\pubs.sqb]\"'"); p.Add("@exitcode", DbType.Int32, direction: ParameterDirection.Output); p.Add("@sqlerrorcode", DbType.Int32, direction: ParameterDirection.Output); connection.Execute(cmd, p, commandType: CommandType.StoredProcedure, commandTimeout: 0);
私はこれを実行すると、それらの出力パラメータをチェックし、私は終了コード870を取得する:私は今の私のはここ
です。
このコマンドは空です。
だから、空の名前のパラメタは表示されません。
アップデート2:トレースに上記のキャプチャ
空のパラメータ文字列は、ストアドプロシージャがそれを見ていない理由を説明している@Parameter1=
に置き換えて終了することを示しています。
sqlbackupでsp_helpを実行すると、paramに名前があることが確信しています –
'sp_help sqlbackup'には、Name、Owner、Type、Created_datetimeの各列のみが含まれています。型が "extended stored proc"であっても、param_order(またはそれが呼び出されたもの)の列はありません。 –
このレーンの名前があるかどうかを調べるために、Red Gateでケースを開きました。我々は見るでしょう。 –