8
votes

.NET / Oracle: Comment exécuter un script avec des instructions DDL programmatiquement

Je veux faire de la manipulation de schéma programmatique sur une base de données Oracle en C #. Par conséquent, je lutterai avec quelques problèmes de base.

Les instructions DDL SQL sont situées dans un fichier de script. Je ne veux pas utiliser sqlplus.exe, mais je veux utiliser oraclecommand sortir des assemblages ODP.NET (System.Oracle.Dataaccess). Voici un exemple de mon fichier de script:

script.sql: xxx

Je veux souligner:

  • Le script contient des instructions DDL (langue de définition de données)
  • Le script contient Lignes vides
  • Le script contient plus d'une déclaration

    Le code suivant doit exécuter mon script: xxx

    exécuter ce code, je reçois une erreur Oracle:

    Oracle.dataaccess.client.oracleException: ORA-00911: caractères non valides

    Peut-être y a peut-être un problème avec la mise en forme des déclarations, je pense. Toute allusion est appréciée. Merci.

    --- Modifier ---

    Pour résumer mes besoins de manière simple: je recherche une approche pour exécuter n'importe quel SQL / Script DDL, qui est exécutable par SQL Plus, de manière programmatique avec C #.


1 commentaires

MISE À JOUR: J'ai essayé d'envelopper le contenu du script avec "Decendare Commencer exécuter immédiatement" .... fin; " Comme cela devrait aider avec les instructions DDL, mais pas de chance, même message d'erreur


4 Réponses :


1
votes

Je vais essayer d'exécuter une ligne à l'heure à l'heure si vous avez un caractère étrange qui bloque l'exécution. (Je ne suis pas sûr également si vous pouviez envoyer toutes vos commandes ensemble sur un seul appel).

Aussi vous doit retirer le point-virgule à la fin des lignes xxx


4 commentaires

Merci. Le problème de cette approche est qu'il pourrait y avoir des points-virgules contenus dans les littéraux - qui briseraient de longs scripts.


Vous dites donc que vous avez un script unique sur plusieurs lignes? Sans délimiteur reconnaissable entre les scripts? Ensuite, vous devez vous séparer de vos contributions car je suis sûr que le point-virgule utilisée comme fermeture d'une seule commande la cause de l'erreur


Je ne suis pas sûr de ce que vous voulez dire avec "script unique sur plusieurs lignes". Mais je vais avoir des déclarations "créer une table" plus longues qu'une ligne. J'ai enfin besoin d'un mécanisme pour exécuter les mêmes scripts qui fonctionnent avec SQLPlus sans problèmes.


Si vous avez des "commandes" qui s'étend sur plusieurs lignes et aussi des littéraux textuels avec des points-virgules à l'intérieur des guillemets, la seule solution possible est une ligne d'analyse par ligne pour éliminer les points-virgules à la fin des "commandes" mais pas celles qui sont dans les littéraux de texte. Pas une tâche facile et vous devez toujours passer chaque «commande» séparée. Je n'ai pas d'installer Oracle pour tester mais, avant de commencer à analyser, je vais essayer un simple fichier SQL avec une seule commande se terminant par un point-virgule, puis sans le point-virgule juste pour vérifier la différence avec ou sans semi-colonie.



1
votes

Comme @steve a dit, les points-virgules provoquent votre erreur. Et vous ne pouvez pas envelopper le fichier entier dans un seul exécuter la commande immédiate , car cela ne peut exécuter qu'une déclaration à la fois. Vous aurez besoin d'analyser votre fichier et d'exécuter chaque commande à lui seul, en supprimant le point-virgule qui délimite les commandes. Votre analyse devra faire face aux littéraux de chaîne, comme vous l'avez noté, ce qui, en plus de contenir des points-virgules, peut également contenir des citations simples doublées ('') dans les guillemets simples (') qui commencent et mettent fin au littéral de la chaîne.


0 commentaires

11
votes

Enveloppez simplement l'intérieur à l'intérieur du début et de la fin et cela fonctionnera en douceur

var content =string.Format("BEGIN {0} END;", File.ReadAllText("script.sql"));
using (var oracleConnection = new OracleConnection(_connectionString))            
{
  oracleConnection.Open();
  using (var command = new OracleCommand(content) { Connection = oracleConnection })
  {
       command.CommandType = CommandType.Text;
       command.ExecuteNonQuery();
  }
}


2 commentaires

Ne pouviez-vous pas simplement déplacer ceux à l'intérieur du script SQL?


Bien sûr, ceci est seulement pour la démonstration, cependant!



2
votes

Merci pour la touche de semi-colon !

Mon code final pour exécuter des scripts Oracle!

1) Il accepte: - lignes / commentaires vides (-) lignes - Commandes multilignes DDL / DML se terminant par;

2) En cas d'erreur, il jette une exception avec le numéro de ligne et la commande SQL! xxx


0 commentaires