Я пытаюсь интегрировать программное обеспечение RedBack 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);
Что мне не хватает?
UPDATE 1:
я проглядел документации Red Gate, который говорит, что ХП не будет на самом деле поднять ошибку SQL, он просто возвращает ошибки в выходной таблице. Slick. Это может объяснить, почему во втором и третьем тестах я получил молчание при неудачах: некоторые основные проблемы, и они не собирают результаты, чтобы показать, почему.
Вот где я сейчас:
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 Backup.
Команда пуста.
Значит, он не видит пустого имени paramater.
Update 2:
Захватив выше в след показывает, что строка пустой параметр заканчивается заменен @Parameter1=
, который объясняет, почему хранимая процедура не видит.
сделать sp_help на sqlbackup, я уверен, что param имеет имя –
'sp_help sqlbackup' включает только столбцы Name, Owner, Type и Created_datetime. Хотя тип «расширенный хранимый процесс» не содержит столбца param_order (или как его называют) ... –
Я открыл случай с красными воротами, чтобы узнать, имеет ли этот параметр имя. Посмотрим. –