2010-10-20 9 views
2

Pour une installation particulière de mon application, j'ai besoin de créer la base de données et le schéma sur le serveur SQL à partir du programme d'installation lui-même. J'ai un programme d'installation personnalisé à travers lequel j'ai pu détecter et installer les pré-requis et le logiciel. L'utilisateur est invité à donner l'adresse IP du serveur de base de données ainsi que le nom d'utilisateur et le mot de passe. Derrière la scène, je crée une connexion et un objet de commande. Je garde les requêtes dans différents fichiers. J'utilise un lecteur et lire le contenu du fichier et définir le contenu du fichier à l'CommandText de l'objet de commande. Le contenu typique du fichier est comme suit:ADO: Exécuter plusieurs TSQL à l'aide de l'objet de connexion et de commande

create database mydatabase 
Go 

Use mydatabase 
Go 

EXEC sp_MSforeachtable @command1 = "DROP TABLE ?" 

Maintenant, la question est les premières déclarations sont exécutées, mais il donne l'erreur après. L'erreur affichée est: "syntax error near 'GO'". J'ai essayé de supprimer l'instruction GO et j'ai également essayé de terminer les instructions SQL avec un point-virgule. L'erreur dans ce cas est "Database 'mydatabase'does not exist. Make sure that the name is entered correctly.". Cependant, si je garde une seule instruction dans le fichier, cela fonctionne très bien.

Quelqu'un peut-il m'aider?

Répondre

4

Comme vous pouvez le voir à http://technet.microsoft.com/en-us/library/aa258908%28SQL.80%29.aspx

Remarques

GO n'est pas une instruction Transact-SQL; il est une commande reconnue par les utilitaires osql et isql et SQL Query Analyzer.

Donc, ceci est la cause de vos problèmes lorsque vous l'exécutez en utilisant le SqlCommand de .Net. À mon avis, vous avez deux options:

1) Exécutez les instructions une par une. Peut-être utiliser un séparateur dans vos fichiers, puis diviser les instructions SQL et les exécuter séquentiellement en utilisant un for/foreach.

2) Utilisez la classe Server à partir de SQL Server Management Objects (SMO) qui devrait vous permettre d'exécuter le script contenant les instructions «Go».

+0

Merci beaucoup. J'ai déjà pris la première option pour le moment et en regardant pour toute autre option viable pour le même. – Kangkan

1

Vous pouvez exécuter plusieurs instructions de commande sql en ajoutant simplement un ";" à la fin de chaque commande au lieu d'une instruction "GO".

Exemple:

cmd.CommandText = @" Update TableA Set ColumnA = 'Test' Where ID = 1; 
       Update TableB Set ColumnA = 'Second line' Where ID = 2; 
      "; 
+0

J'ai essayé ceci. Mais ça ne fonctionne pas. Si vous regardez attentivement vers la fin de mon message, j'obtiens l'erreur "La base de données 'mydatabase' n'existe pas.Assurez-vous que le nom est entré correctement." dans ce cas. – Kangkan