加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何使用非常规参数调用存储过程?

发布时间:2020-12-15 08:01:12 所属栏目:百科 来源:网络整理
导读:我正在尝试将Red Gate的SQLBackup Pro软件集成到我用C#编写的内部备份软件中.这样做的自然方式是通过他们的 Extended Stored Procedure.问题在于它以我以前从未见过的格式调用: master..sqlbackup '-SQL "BACKUP DATABASE pubs TO DISK = [C:Backupspubs.
我正在尝试将Red Gate的SQLBackup Pro软件集成到我用C#编写的内部备份软件中.这样做的自然方式是通过他们的 Extended Stored Procedure.问题在于它以我以前从未见过的格式调用:
master..sqlbackup '-SQL "BACKUP DATABASE pubs TO DISK = [C:Backupspubs.sqb]"'

通过SSMS运行时,这很好用.我遇到麻烦的地方是尝试从C#调用它(使用.NET 4和Dapper Dot Net).

我的第一次尝试不起作用,因为它将整个cmd字符串解释为存储过程的名称,并抛出错误“找不到存储过程””:

var cmd = "master..sqlbackup '-SQL "BACKUP DATABASE pubs TO DISK = [C:Backupspubs.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:Backupspubs.sqb]"'");
connection.Execute(cmd,p,commandTimeout: 0);

我的第三次尝试似乎也成功了,但实际上没有进行备份:

var cmd = "master..sqlbackup '-SQL "BACKUP DATABASE pubs TO DISK = [C:Backupspubs.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:Backupspubs.sqb]"'");
p.Add("@exitcode",DbType.Int32,direction: ParameterDirection.Output);
p.Add("@sqlerrorcode",direction: ParameterDirection.Output);
connection.Execute(cmd,commandTimeout: 0);

当我运行它并检查那些输出参数时,我得到退出代码870:

No command passed to SQL Backup.

The command is empty.

所以它没有看到空命名的参数.

更新2:

在跟踪中捕获上述内容表明空参数字符串最终被@ Parameter1 =替换,这解释了存储过程没有看到它的原因.

解决方法

你的第一次尝试看起来几乎是对我注意到你没能逃脱反斜杠.对于这种情况,使用@前缀来禁用字符串的转义通常更容易.此外,您希望使用exec前置并使其成为CommandType.Text:

编辑:修复我自己的逃避错误

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读