我正在尝试将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,commandTimeout: 0);
我的第三次尝试似乎也成功了,但实际上没有进行备份:
var cmd = "master..sqlbackup '-sql \"BACKUP DATABASE pubs TO DISK = [C:\\Backups\\pubs.sqb]\"'"; connection.Execute(cmd,commandTimeout: 0);
我错过了什么?
更新1:
我忽略了Red Gate文档,该文档说存储过程实际上不会引发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",direction: ParameterDirection.Output); connection.Execute(cmd,commandTimeout: 0);
No command passed to sql Backup.
The command is empty.
所以它没有看到空命名的参数.
更新2:
在跟踪中捕获上述内容表明空参数字符串最终被@ Parameter1 =替换,这解释了存储过程没有看到它的原因.