我正试图将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