2012-02-09 11 views
7

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=に置き換えて終了することを示しています。

+0

sqlbackupでsp_helpを実行すると、paramに名前があることが確信しています –

+0

'sp_help sqlbackup'には、Name、Owner、Type、Created_datetimeの各列のみが含まれています。型が "extended stored proc"であっても、param_order(またはそれが呼び出されたもの)の列はありません。 –

+0

このレーンの名前があるかどうかを調べるために、Red Gateでケースを開きました。我々は見るでしょう。 –

答えて

2

それは総ですし、全く私が望んでいるが、これは私が今働いて持っているものである:これは、バックアップを実行

var cmd = String.Format(@" 
DECLARE @exitcode int; 
DECLARE @sqlerrorcode int; 
EXEC master..sqlbackup '-SQL \"BACKUP DATABASE [{0}] TO DISK = [{1}])\"', @exitcode OUTPUT, @sqlerrorcode OUTPUT; 
IF (@exitcode >= 500) OR (@sqlerrorcode <> 0) 
BEGIN 
RAISERROR('SQLBackup failed with exitcode %d and sqlerrorcode %d ', 16, 1, @exitcode, @sqlerrorcode) 
END 
", myDbName, myBkpPath); 

connection.Execute(cmd, commandTimeout: 0); 

と、実際に生じた根本的な問題を暴露障害ステータスを返します静かな失敗の失敗の一部。

実行前に、myDbNameが既知のデータベースのリストと照合されて存在することを確認し、myBkpPathが自分のコードによって生成されるため、注射について心配していません。それはちょうど...まあ、それを見てください。恐ろしいです。

2

あなたの最初の試みは大丈夫です。私が気づくのは、あなたがバックスラッシュから脱出しなかったことです。このような場合、@接頭辞を使用して文字列のエスケープを無効にするほうが簡単です。また、あなたは、execを先頭に追加し、それCommandType.Textようにしたい:

編集:ここ

var cmd = @"exec 'master..sqlbackup -SQL ""BACKUP DATABASE pubs TO DISK = [C:\Backups\pubs.sqb]""'"; 
connection.Execute(cmd, commandType: CommandType.Text, commandTimeout: 0); 
+0

申し訳ありませんが、バックスラッシュは実際にエスケープされましたが、それは問題に終わっていませんでした。引用符はすでに最も混乱していた部分であり、パス(一度これがわかると)はパラメータまたは(god forbid)文字列の書式設定によって挿入されるため、@ @ ""構文を使用するのではなくエスケープすることにしました。 –

+0

私も言及したようにexecを追加しようとしましたか? –

+0

はい。 #2と#3と同じ結果:何もせずにすぐに戻りますが、失敗したようには見えません。 –

0

私自身の脱出バグを修正し、あなたは拡張ストアドプロシージャを呼び出す典型的なストアドプロシージャを作成し、それを呼び出してみましたコードから?ここで扱うパラメータはごくわずかです。

+0

私はそれがうまくいくと確信していますが、問題のストアドプロシージャを作成して管理する必要があるため、非常にスケーラブルなソリューションではありません。 –

+0

すべてのサーバーで拡張ストアドプロシージャではありませんか? 「マネージド」とはどういう意味ですか? – ScottE

+0

拡張ストアドプロシージャは、ネットワーク対応のインストーラを持つソフトウェアパッケージの一部です。このインストーラを使用すると、ネットワーク上に簡単にプッシュしてアップグレードすることができます。私はこれがストアドプロシージャでは不可能だと言っているのではなく、むしろ既にそこにあるものと一緒に作業するコードを手に入れたいと思っています。 –

0

テストにはいくつかの問題がありました。

最初に、CommandType.StoredProcedureを設定します。 CommandType.Textに設定して、その文字列をexec'dに渡すだけで十分にスマートにする必要があります。

次の例では、実際にパラメータに名前を付けていませんでした。 SqlBackupプロシージャを見て、パラメータ名が何であるかを確認してください。それを使ってください。それ以外の場合は、何も割り当てられません。

+0

これらの問題はどちらも私の質問で説明されています。最初の: "私の最初の試行は、ストアドプロシージャの名前としてcmdの文字列全体を解釈し、ストアドプロシージャ ''"を見つけることができませんエラーをスローするため動作しません。私の3回目の試みはまさにこれですが、バックアップは黙って失敗しました。第二に、私の質問に私のコメントを参照してください。パラメータには、文書化された名前がありません。 –

+0

@ sh-beta:パラメータ名を決定するためにprocを調べることができます。ドキュメンテーションの必要はありません。暗号化されたprocsでさえ、パラメータの名前が何であるか教えてくれます。管理スタジオでは、保存されたproc定義を展開し、パラメータリストを見ることができます。または、procを右クリックしてスクリプトを実行すると、パラメータの名前を取得できます。 – NotMe

+0

これは何も役に立つものではありません。スクリプト定義全体は、 "EXEC dbo.sp_addextendedproc N'sqlbackup '、' '" –

関連する問題