Comment puis-je exécuter un fichier .sql à partir de C #?
Pour certains tests d'intégration je veux me connecter à la base de données et exécuter une .fichier sql qui a le schéma nécessaires pour les tests de réellement exécuter, y compris les GO instructions. Comment puis-je exécuter l' .fichier sql? (ou est-ce totalement le mauvais chemin à suivre?)
J'ai trouvé un post dans le forum MSDN montrant ce code:
using System.Data.SqlClient;
using System.IO;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string sqlConnectionString = "Data Source=(local);Initial Catalog=AdventureWorks;Integrated Security=True";
FileInfo file = new FileInfo("C:\\myscript.sql");
string script = file.OpenText().ReadToEnd();
SqlConnection conn = new SqlConnection(sqlConnectionString);
Server server = new Server(new ServerConnection(conn));
server.ConnectionContext.ExecuteNonQuery(script);
}
}
}
mais sur la dernière ligne, j'obtiens cette erreur:
Système.De la réflexion.TargetInvocationException:
Une Exception a été levée par le
cible d'un appel. --->
Système.TypeInitializationException:
L'initialiseur de type pour"
a déclenché une exception. --->
.ModuleLoadException:
Le module C++ pas réussi à charger au cours de
domaine d'application de l'initialisation. --->
Système.DllNotFoundException: Impossible de
charger la DLL 'MSVCR80.dll': Le spécifié
le module n'a pas pu être trouvé. (À l'Exception de
de HRESULT: 0x8007007E).
M'a dit d'aller et de télécharger cette DLL à partir de quelque part, mais ça a l'air très hacky. Est-il le moyen le plus propre? Est-il une autre façon de le faire? Ce que je fais mal?
Je fais cela avec Visual Studio 2008, SQL Server 2008 .Net 3.5SP1 et C# 3.0.
source d'informationauteur pupeno
Vous devez vous connecter pour publier un commentaire.
Vous ne devriez pas avoir besoin de SMO pour exécuter des requêtes. Essayez d'utiliser l'objet SqlCommand à la place. Retirez à l'aide de ces déclarations. Utilisez ce code pour l'exécution de la requête:
Aussi, de supprimer la référence du projet de SMO. Remarque: vous aurez envie de nettoyer correctement les ressources.
Mise à jour:
L'ADO.NET les bibliothèques ne prennent pas en charge le " GO " mot-clé. Il semble que vos options sont les suivantes:
En fait, dans ce cas, je pense que le SMO peut être la meilleure option, mais vous aurez besoin pour traquer pourquoi la dll n'a pas été trouvé.
MSVCR80 est le Visual C++ 2005 de l'exécution. Vous devrez peut-être installer le package d'exécution. Voir http://www.microsoft.com/downloads/details.aspx?FamilyID=200b2fd9-ae1a-4a14-984d-389c36f85647&displaylang=en pour plus de détails.
En plus de la résolution de la DLL en question et Matt Brunell de la réponse (qui me semble plus approprié pour ce que vous essayez de le faire), vous pouvez utiliser l'utilitaire SQLCMD outil de ligne de commande (à partir de SQL d'installation des outils Client) pour exécuter ces scripts SQL. Juste être sûr que c'est sur votre chemin pour vous de ne pas lutter avec les chemins d'accès.
Ce serait jouer de la sorte:
De commande:
Paramètres (cas):
D'exécuter du Code SQL fichiers:
Voir http://msdn.microsoft.com/en-us/library/ms162773.aspx pour plus d'informations sur le SQLCMD outil.
Ayant le même besoin pour exécuter automatiquement un script de base de données à partir du code, je me suis mis à analyser le script SQL pour supprimer GO instructions et de diviser le script en plusieurs commandes (comme suggéré par @MattBrunell). Retrait de l'ALLER consolidés a été facile, mais le fractionnement des déclarations sur
"\r\n"
ne fonctionne pas depuis ce foutu le multi-états. Des tests quelques approches différentes, j'ai été assez surpris de découvrir que le script n'a pas à être divisée en plusieurs commandes. J'ai supprimé tous les "GO" des déclarations et a envoyé le script en entier (y compris les commentaires) dans SqlCommand:Ce code a été testé avec SQL Server 2008 R2 et le script généré par "Base de données -> Tâches -> Générer des Scripts...". Ci-dessous sont quelques exemples de commandes dans le script:
Je suppose qu'il pourrait y avoir une longueur maximale pour une seule SqlCommand, au-dessus de laquelle le script doivent être séparés. Mon script qui exécute sans problèmes, contient environ 1800 déclarations et est de 520 ko.
Avez-vous essayé de courir avec une très, très basique, script dans le .fichier sql? Peut-être quelque chose qui insère une ligne ou crée un arbitraire de la table? Quelque chose qui est très facile à vérifier? Essentiellement, ce code est dur de codage sql, sauf que vous êtes en train de lire à partir d'un fichier. Si vous pouvez l'obtenir pour fonctionner avec un très simple fichier, alors je dirais qu'il y a probablement quelque chose de mal avec la structure du fichier lui-même. Le post fait référence au fait qu'il existe des dispositions sur ce qui peut et ne peut pas être dans le fichier. Si rien d'autre, c'est un bon endroit pour commencer le dépannage.
Vous pouvez être intéressé par ceci:
http://geekswithblogs.net/thomasweller/archive/2009/09/08/automating-database-script-execution.aspx
Il présente un usage général de "banc d'essai" pour exécuter automatiquement des scripts sql. Il y a aussi l'exemple de code disponible, et il n'y a pas de dépendances à inhabituels assemblées que ce soit...
Si vous ajoutez des références suivantes dans votre projet, puis le code original sera beau travail.
J'utilise SQL server 2008 Express.
Chemin d'accès:
C:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblées\
Fichiers:
microsoft.sqlserver.smo.dll, microsoft.sqlserver.connectioninfo.dll et Microsoft.SqlServer.Management.Sdk.Sfc.dll