7
votes

Comment appeler une procédure stockée avec des paramètres non conventionnels?

Je tente d'intégrer le logiciel SQLBackup Pro Red Gate dans mon logiciel de sauvegarde interne, écrit en C #. La voie naturelle de le faire est via leur Procédure stockée étendue a>. Les problèmes sont que cela s'appelle dans un format que je n'ai jamais vu auparavant: XXX PRE>

Cela fonctionne simplement lorsque vous exécutez VIA SSMS. Où je rencontre des ennuis, c'est essayer de l'appeler de C # (en utilisant .NET 4 et Dapper Dot Net ). P>

Ma première tentative ne fonctionne pas car elle interprète l'ensemble de la chaîne cmd code> comme nom de la procédure stockée et jette l'erreur "Impossible de trouver Procédure stockée '' ": p>

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);


4 commentaires

faire un sp_help sur sqlbackup, je suis sûr que Param a un nom


sp_help sqlbackup inclut uniquement le nom, le propriétaire, le type et les colonnes créées_dateTime. Même si le type est "PROC STRONPTÉS", il n'y a pas de param_order (ou autre qu'on appelle) colonne ...


J'ai ouvert un boîtier avec Red Gate pour savoir si ce param a un nom. Nous verrons.


Selon Red Gate, ce paramètre n'a aucun nom. Il utilise juste ce qui est dans la première position. Cela me semble stupide ...


4 Réponses :


2
votes

Votre première tentative semble presque bonne. Ce que je remarque, c'est que vous n'avez pas réussi à échapper aux backslashes. Pour ce genre de chose, il est souvent plus facile d'utiliser le préfixe @ pour désactiver l'échappement de la chaîne. En outre, vous souhaitez préparer avec EXEC et le faire CommandType.text Code>:

Modifier: Correction de mes propres bugs s'échapper ici P>

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


5 commentaires

Désolé, les barres anti-backs étaient effectivement échappées mais cela ne s'est pas passé dans la question. J'ai choisi de les échapper plutôt que d'utiliser @ "" Syntaxe car les guillemets étaient déjà la partie la plus déroutante et les chemins (une fois que cela est compris) sera inséré via des paramètres ou (dieu interdire) Formatage de chaînes .


Avez-vous essayé d'ajouter l'exécutif comme je l'ai également mentionné?


Oui. Même résultat que n ° 2 et n ° 3: retourne immédiatement sans faire de travail, mais ne semble pas échouer.


@ sh-beta: plus au point, avez-vous changé le vôtre de CommandType.StoredProcedure à CommandType.text? C'est le problème principal.


@Chrislitivement oui. Voir la troisième tentative.



0
votes

Avez-vous essayé de créer une procédure stockée typique qui appelle la procédure stockée étendue et l'appelant à partir du code? On dirait que vous n'avez que quelques paramètres pour traiter ici.


3 commentaires

Je suis sûr que cela fonctionnerait, mais n'est pas une solution très évolutive puisque la procédure stockée en question devrait être créée et gérée sur chacun de mes serveurs SQL.


La procédure stockée étendue n'est-elle pas sur chaque serveur? Qu'entendez-vous par «géré»?


La procédure stockée étendue fait partie d'un progiciel avec un programme d'installation de réseau qui vous permet de le repousser de manière tritive et de la mettre à niveau sur un réseau. Je ne dis pas que cela est impossible avec une procédure stockée, mais je préférerais simplement obtenir mon code de travailler avec ce qui est déjà là-bas.



2
votes

C'est brut et pas du tout ce que je voulais, mais c'est ce que j'ai travaillé maintenant: xxx

Ceci exécute la sauvegarde et renvoie réellement l'état de défaillance, qui a exposé un problème sous-jacent Cela a causé une partie de défaillance des défaillances silencieuses.

Avant son exécution, MyDBName est cochée contre une liste de bases de données connues pour que cela existe et myBkppath est généré par mon code, donc je ne suis pas inquiet pour les injections . C'est juste ... eh bien, regarde ça. Hideous.


0 commentaires

0
votes

Vous avez eu plusieurs problèmes dans vos tests.

Dans la première, vous définissez le CommandType.StoredProcedure . Vous devriez l'avoir défini sur CommandType.text de sorte qu'il serait suffisamment intelligent pour simplement passer cette chaîne à exécuter.

Dans les exemples suivants, vous n'avez pas réellement donné le paramètre un nom. Allez regarder leur procédure SQLBackup et voir quels sont les noms de paramètres. Ensuite, utilisez-le. Sinon, rien ne sera attribué à cela.


3 commentaires

Ces deux problèmes sont expliqués dans ma question. Le premier: "Ma première tentative ne fonctionne pas car elle interprète la chaîne CMD entière comme nom de la procédure stockée et jette que l'erreur ne peut pas trouver la procédure stockée" "". Ma troisième tentative est exactement cela, mais la sauvegarde a échoué silencieusement. Pour la seconde, voir mes commentaires sur ma question. Le paramètre n'a pas de nom documenté.


@ sh-beta: Vous pouvez inspecter la procuration afin de déterminer les noms de paramètres. Pas besoin de documentation. Même les Procs cryptés vous indiqueront quels sont les noms des paramètres. Dans Management Studio, vous pouvez développer la définition de la PROP stockée et consulter la liste des paramètres. Ou vous pouvez simplement cliquer avec le bouton droit de la souris sur le processus et le script afin de pouvoir obtenir le nom du paramètre.


Celui-ci ne donne rien d'utile. Toute la définition scriptée est "EXEC DBO.SP_ADDEXDEDPROC N'SQLBACK ',' '"