【发布时间】:2012-02-09 19:34:25
【问题描述】:
我正在尝试将 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:
我忽略了 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", DbType.Int32, direction: ParameterDirection.Output);
connection.Execute(cmd, p, commandType: CommandType.StoredProcedure, commandTimeout: 0);
当我运行它并检查这些输出参数时,我得到退出代码 870:
没有命令传递给 SQL 备份。
命令为空。
所以它没有看到空名参数。
更新 2:
在跟踪中捕获上述内容表明空参数字符串最终被替换为@Parameter1=,这解释了为什么存储过程看不到它。
【问题讨论】:
-
在sqlbackup上做一个sp_help,我确定param有名字
-
sp_help sqlbackup仅包括名称、所有者、类型和 Created_datetime 列。即使类型是“扩展存储过程”,也没有 param_order(或其他任何名称)列... -
我用 Red Gate 打开了一个案例,以了解该参数是否有名称。我们拭目以待。
-
根据Red Gate的说法,这个参数没有名字。它只使用第一个位置的任何内容。这看起来很傻......
标签: c# sql-server stored-procedures dapper