Je n'arrive pas à exécuter SQL qui crée une base de données à l'aide d'un objet DBCommand. Qu'est-ce que je fais mal? Voici mon code: Voici l'erreur: p> La syntaxe de la requête n'est pas valide., Près de
Terme '/', ligne 1, colonne 2.
Description: Une exception non gérée
eu lieu pendant l'exécution de la
Demande Web actuelle. S'il vous plaît examiner le
Trace de pile pour plus d'informations sur
l'erreur et l'endroit où il est originaire
le code. p>
Détails d'exception:
System.data.entitysqxception: la
La syntaxe de requête n'est pas valide., Près du terme
'/', ligne 1, colonne 2. p>
blockQuote> Voici la première partie du fichier. L'exception est lancée en ce qui concerne les commentaires sur la première ligne: p> Ce même script SQL exécute simplement de SQL Management Studio Express (en fait que l'application a généré ce script!) . C'est juste la vue de la requête de l'explorateur de serveur de Studio de Visual Studio et de mon propre code qui semble échouer. P> P>
4 Réponses :
Voici un extrait de code que je Publié sur mon blog Il y a quelque temps, cela peut résoudre ce problème: Il divise le script SQL dans des commandes distinctes et exécute chacun d'eux. J'utilise régulièrement cela pour configurer des bases de données de test avec des scripts SQL générés. P> p>
+1, mais je ne pense pas que ce soit le problème i> problème ici. L'erreur se plaint du commentaire au début du fichier.
@Joel: Je pense que c'est mai i> être qu'il se plaint en fait de la déclaration complète, qui arrive à commencer par le commentaire. On ne peut pas être sûr cependant, alors j'ai édité le texte pour être moins sûr de savoir s'il fournit une solution ou non.
Le séparateur de lots Go est valable entouré d'espace blanc, au moins dans SMSS pour SQL Server 2005.
@Mork: Command.Dispose () code> n'a plus besoin car il est à l'intérieur à l'aide de code>
Fonctionne comme un charme même avec des trucs complexes
Vous devez utiliser les classes de gestion SQL au lieu du SQLCOMMAND normal. Cette page vous indique Comment le faire. Si vous essayez d'analyser vous-même le SQL vous-même, il y aura toujours des cas de bord que vous manquez. Par exemple, si une chaîne dans le code contient le mot "go" avec des retours de chariot de direction et de fuite?
ajoutez ces références: p>
Ensuite, vous pouvez utiliser ce code: P>
string connectionString, scriptText; SqlConnection sqlConnection = new SqlConnection(connectionString); ServerConnection svrConnection = new ServerConnection(sqlConnection); Server server = new Server(svrConnection); server.ConnectionContext.ExecuteNonQuery(scriptText);
Impressionnant. Je n'ai pas pu trouver le Microsoft.SQLServer.management.sdk.sfc CODE> Assemblage de référence, mais il s'est avéré qu'il n'était pas nécessaire de toute façon.
Je trouve qu'il est étrange que vous obtenez une intitenceqlexception ...
Une autre solution que vous pouvez choisir, est d'exécuter ce script via l'outil OSQL Command-Line. Vous pouvez créer une instance System.Diagnostics.Process, et utilisez ce processus pour appeler OSQL qui exécute le script. P>
System.Diagnostics.Process p = new System.Diagnostics.Process ();
p.StartInfo.FileName = Environment.GetEnvironmentVariable ("COMSPEC");
p.StartInfo.UseShellExecute = false;
p.StartInfo.ErrorDialog = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardOutput = true;
p.Start ();
p.StandardInput.WriteLine ("echo off");
string command = @"osql -U -b -e -S " + servername + " -d " + databasename + " -i \'" + filename + "\'";
p.StandardInput.WriteLine (command);
p.StandardInput.WriteLine ("exit");
p.WaitForExit ();
Merci pour le conseil. Cela peut s'avérer utile dans un autre scénario de la mienne.
dans SQL Server Vous pouvez concaténer autant de requêtes que vous le souhaitez avec un séparateur d'espace simple, mais pour cela, vous devez supprimer le "Go".
Exemple:
BEGIN TRANSACTION SET QUOTED_IDENTIFIER ON SET ARITHABORT ON SET NUMERIC_ROUNDABORT OFF SET CONCAT_NULL_YIELDS_NULL ON SET ANSI_NULLS ON SET ANSI_PADDING ON SET ANSI_WARNINGS ON COMMIT BEGIN TRANSACTION $remove this GO here$ CREATE TABLE dbo.Tmp_Tralala( ERRID numeric (18,0) NOT NULL) ) ON [PRIMARY] $remove this GO here$ IF EXISTS(SELECT * FROM dbo.Tralala) EXEC('INSERT INTO ..etc
Remarque: go n'est pas une commande SQL, il s'agit d'une commande à l'outil client (tel que OSQL, analyseur de requête ou dans ce cas SMSS.) Pour briser le script dans des "lots" séparés. Chaque lot est un appel séparé sur le serveur.
Dupliqué possible de Exécutez un grand script SQL (avec des commandes Go) a >