Je suis sûr que cette question a déjà été répondue, mais je n'ai pas pu trouver de réponse à l'aide de l'outil de recherche.
En utilisant c #, j'aimerais exécuter un fichier .sql. Le fichier sql contient plusieurs instructions sql, dont certaines sont réparties sur plusieurs lignes. J'ai essayé de lire le fichier et j'ai essayé d'exécuter le fichier en utilisant ODP.NET ... mais je ne pense pas qu'ExecuteNonQuery soit vraiment conçu pour faire cela.
J'ai donc essayé d'utiliser sqlplus via la création d'un processus ... Cependant, à moins que je ne lance le processus avec UseShellExecute défini sur true, sqlplus se bloquerait et ne quitterait jamais. Voici le code qui NE FONCTIONNE PAS.
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "sqlplus";
p.StartInfo.Arguments = string.Format("xx/xx@{0} @{1}", in_database, s);
p.StartInfo.CreateNoWindow = true;
bool started = p.Start();
p.WaitForExit();
WaitForExit ne retourne jamais .... Sauf si j'ai défini UseShellExecute sur true. Un effet secondaire de UseShellExecute est que vous ne pouvez pas capturer la sortie redirigée.
Réponses:
la source
<startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/> </startup>
J'ai essayé cette solution avec Microsoft.SqlServer.Management mais cela ne fonctionnait pas bien avec .NET 4.0, j'ai donc écrit une autre solution en utilisant uniquement le framework .NET libs.
la source
Cela fonctionne sur Framework 4.0 ou supérieur. Prend en charge "GO". Afficher également le message d'erreur, la ligne et la commande sql.
la source
connection.Close()
la connexion sera fermée par leusing
vous l'avez enveloppé.Mettez la commande pour exécuter le script sql dans un fichier batch, puis exécutez le code ci-dessous
dans le fichier batch, écrivez quelque chose comme ceci (exemple pour le serveur sql)
la source
Cela fonctionne pour moi:
la source
Ajout d'améliorations supplémentaires à la réponse surajits:
De plus, j'ai dû ajouter les références suivantes à mon projet:
C:\Program Files\Microsoft SQL Server\120\SDK\Assemblies\Microsoft.SqlServer.ConnectionInfo.dll
C:\Program Files\Microsoft SQL Server\120\SDK\Assemblies\Microsoft.SqlServer.Smo.dll
Je n'ai aucune idée si ce sont les bonnes dll: s à utiliser car il y a plusieurs dossiers dans C: \ Program Files \ Microsoft SQL Server mais dans mon application, ces deux fonctionnent.
la source
J'ai réussi à trouver la réponse en lisant le manuel :)
Cet extrait du MSDN
Transforme le code en ceci;
Qui sort maintenant correctement.
la source
p.StandardOutput.ReadToEnd();
ne sort jamaisIl y a deux points à considérer.
1) Ce code source a fonctionné pour moi:
J'ai défini le répertoire de travail sur le répertoire de script, de sorte que les sous-scripts du script fonctionnent également.
Appelez-le par exemple comme
Execute("usr/pwd@service", "c:\myscripts", "script.sql")
2) Vous devez finaliser votre script SQL avec l'instruction
EXIT;
la source
En utilisant EntityFramework, vous pouvez opter pour une solution comme celle-ci. J'utilise ce code pour initialiser les tests e2e. Pour éviter les attaques par injection SQL, assurez-vous de ne pas générer ce script en fonction de l'entrée utilisateur ou d'utiliser des paramètres de commande pour cela (voir surcharge d'ExecuteSqlCommand qui accepte les paramètres).
la source
Je n'ai trouvé aucun moyen exact et valide de faire cela. Donc, après une journée entière, je suis venu avec ce code mixte réalisé à partir de différentes sources et en essayant de faire le travail.
Mais il génère toujours une exception
ExecuteNonQuery: CommandText property has not been Initialized
même s'il exécute avec succès le fichier de script - dans mon cas, il crée avec succès la base de données et insère des données au premier démarrage.la source