我正試圖將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);
我的第二次嘗試立即返回並出現(以C#)成功,但沒有備份實際上被採用(這也吮吸參數):
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);
我的第三次嘗試也似乎是成功的,但沒有備份實際上被採用:
var cmd = "master..sqlbackup '-SQL \"BACKUP DATABASE pubs TO DISK = [C:\\Backups\\pubs.sqb]\"'";
connection.Execute(cmd, commandTimeout: 0);
我錯過了什麼?
更新1:
我忽略了紅門文檔,說的存儲過程實際上不會提高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:
無命令傳遞到SQL備份。
該命令爲空。
所以它沒有看到空名的參數。
更新2:
捕捉上面的跟蹤顯示空參數字符串結束了@Parameter1=
更換這就解釋了爲什麼在存儲過程並不這麼看。
在sqlbackup上執行sp_help,我確信該參數的名稱爲 – 2012-02-10 06:28:09
'sp_help sqlbackup'只包含名稱,所有者,類型和Created_datetime列。儘管類型是「擴展存儲過程」,但沒有param_order(或任何它被稱爲)列... – 2012-02-10 16:03:47
我打開了一個紅門案例來了解該參數是否有名稱。我們拭目以待。 – 2012-02-10 16:38:09