Próbuję zintegrować oprogramowanie SQLBackup Pro Red Gate z moim wewnętrznym oprogramowaniem do tworzenia kopii zapasowych, napisanym w języku C#. Naturalnym sposobem na to jest ich Extended Stored Procedure. Problem polega na tym, że jest wywoływany w formacie, którego nigdy wcześniej nie widziałem:Jak wywołać procedurę składowaną o niekonwencjonalnych parametrach?
master..sqlbackup '-SQL "BACKUP DATABASE pubs TO DISK = [C:\Backups\pubs.sqb]"'
Działa to dobrze, gdy jest uruchamiany przez SSMS. Tam, gdzie napotkasz problemy, próbuje wywołać to z C# (używając .NET 4 i Dapper Dot Net).
Moja pierwsza próba nie działa ponieważ interpretuje całą cmd
ciąg jako nazwę procedury przechowywanej i wyrzuca błąd „nie można odnaleźć procedury przechowywanej«»”:
var cmd = "master..sqlbackup '-SQL \"BACKUP DATABASE pubs TO DISK = [C:\\Backups\\pubs.sqb]\"'";
connection.Execute(cmd, commandType: CommandType.StoredProcedure, commandTimeout: 0);
Moja druga próba natychmiast powraca i pojawia się (C#), aby odnieść sukces, ale nie kopia zapasowa jest rzeczywiście podjęte (to jest do bani również dla parametryzacji):
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);
Moja trzecia próba wydaje się również, aby odnieść sukces, ale nie kopia zapasowa jest rzeczywiście zrobione:
var cmd = "master..sqlbackup '-SQL \"BACKUP DATABASE pubs TO DISK = [C:\\Backups\\pubs.sqb]\"'";
connection.Execute(cmd, commandTimeout: 0);
Czego mi brakuje?
UPDATE 1:
przeoczyłem dokumentację Red Gate, który mówi, że nie będą przechowywane proc rzeczywiście podnieść błąd SQL, po prostu zwraca błędy w tabeli wyjściowej. Przysiek. To może wyjaśnić, dlaczego miałem cichą awarię w drugim i trzecim teście powyżej: jakiś podstawowy problem i nie zbierają danych wyjściowych, aby pokazać dlaczego.
Oto gdzie jestem teraz:
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);
Kiedy uruchomić tego i sprawdzić te parametry wyjściowe, mam kod Exit 870:
No przekazany do polecenia SQL kopii zapasowej.
Polecenie jest puste.
Tak więc nie widzimy pustego nazwanego paramateru.
Aktualizacja 2:
Przechwytywanie wyżej w ślad wskazuje, że parametr pusty ciąg kończy się zastąpić @Parameter1=
co wyjaśnia, dlaczego procedura przechowywana nie widzi.
zrobić sp_help na sqlbackup, jestem pewien, że param ma nazwę –
'sp_help sqlbackup' zawiera tylko kolumny Nazwa, Właściciel, Typ i Created_datetime. Mimo że typ jest "rozszerzonym procem przechowywanym", nie ma kolumny "param_order" (lub jak tam się nazywa) ... –
Otworzyłem skrzynkę z czerwoną bramą, aby sprawdzić, czy ten parametr ma nazwę. Zobaczymy. –